LCOV - code coverage report
Current view: top level - sc/source/ui/view - preview.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 371 903 41.1 %
Date: 2015-06-13 12:38:46 Functions: 32 40 80.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include "scitems.hxx"
      21             : #include <editeng/eeitem.hxx>
      22             : 
      23             : #include <svtools/colorcfg.hxx>
      24             : #include <svx/fmview.hxx>
      25             : #include <editeng/sizeitem.hxx>
      26             : #include <svx/svdpagv.hxx>
      27             : #include <sfx2/bindings.hxx>
      28             : #include <sfx2/viewfrm.hxx>
      29             : #include <sfx2/dispatch.hxx>
      30             : #include <svtools/accessibilityoptions.hxx>
      31             : #include <svl/itemset.hxx>
      32             : #include <tools/multisel.hxx>
      33             : #include <vcl/waitobj.hxx>
      34             : #include <vcl/settings.hxx>
      35             : 
      36             : #include "preview.hxx"
      37             : #include "prevwsh.hxx"
      38             : #include "prevloc.hxx"
      39             : #include "docsh.hxx"
      40             : #include "docfunc.hxx"
      41             : #include "printfun.hxx"
      42             : #include "printopt.hxx"
      43             : #include "stlpool.hxx"
      44             : #include "undostyl.hxx"
      45             : #include "drwlayer.hxx"
      46             : #include "scmod.hxx"
      47             : #include "markdata.hxx"
      48             : #include "globstr.hrc"
      49             : #include "sc.hrc"
      50             : #include "AccessibleDocumentPagePreview.hxx"
      51             : #include <vcl/lineinfo.hxx>
      52             : #include <svx/algitem.hxx>
      53             : #include <editeng/lrspitem.hxx>
      54             : #include <editeng/ulspitem.hxx>
      55             : #include <editeng/colritem.hxx>
      56             : #include <editeng/fhgtitem.hxx>
      57             : #include "attrib.hxx"
      58             : #include "pagepar.hxx"
      59             : #include <com/sun/star/accessibility/XAccessible.hpp>
      60             : #include "AccessibilityHints.hxx"
      61             : #include <vcl/svapp.hxx>
      62             : #include "viewutil.hxx"
      63             : #include <columnspanset.hxx>
      64             : #include <docpool.hxx>
      65             : #include <patattr.hxx>
      66             : 
      67             : #include <boost/scoped_ptr.hpp>
      68             : 
      69             : // STATIC DATA -----------------------------------------------------------
      70             : 
      71             : #define SC_PREVIEW_SHADOWSIZE   2
      72             : 
      73          32 : static long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, std::vector<long>& nPages )
      74             : {
      75          32 :     long nDisplayStart = 0;
      76          32 :     for (SCTAB i=0; i<nTab; i++)
      77             :     {
      78           0 :         if ( pDoc->NeedPageResetAfterTab(i) )
      79           0 :             nDisplayStart = 0;
      80             :         else
      81           0 :             nDisplayStart += nPages[i];
      82             :     }
      83          32 :     return nDisplayStart;
      84             : }
      85             : 
      86           8 : ScPreview::ScPreview( vcl::Window* pParent, ScDocShell* pDocSh, ScPreviewShell* pViewSh ) :
      87             :     Window( pParent ),
      88             :     nPageNo( 0 ),
      89             :     nZoom( 100 ),
      90             :     nTabCount( 0 ),
      91             :     nTabsTested( 0 ),
      92             :     nPages(),
      93             :     nFirstAttr(),
      94             :     nTab( 0 ),
      95             :     nTabPage( 0 ),
      96             :     nTabStart( 0 ),
      97             :     nDisplayStart( 0 ),
      98             :     aDate( Date::SYSTEM ),
      99             :     aTime( tools::Time::SYSTEM ),
     100             :     nTotalPages( 0 ),
     101             :     pLocationData( NULL ),
     102             :     pDrawView( NULL ),
     103             :     pDocShell( pDocSh ),
     104             :     pViewShell( pViewSh ),
     105             :     bInGetState( false ),
     106             :     bValid( false ),
     107             :     bStateValid( false ),
     108             :     bLocationValid( false ),
     109             :     bInPaint( false ),
     110             :     bInSetZoom( false ),
     111             :     bLeftRulerMove( false ),
     112             :     bRightRulerMove( false ),
     113             :     bTopRulerMove( false ),
     114             :     bBottomRulerMove( false ),
     115             :     bHeaderRulerMove( false ),
     116             :     bFooterRulerMove( false ),
     117             :     bLeftRulerChange( false ),
     118             :     bRightRulerChange( false ),
     119             :     bTopRulerChange( false ),
     120             :     bBottomRulerChange( false ),
     121             :     bHeaderRulerChange( false ),
     122             :     bFooterRulerChange( false ),
     123             :     bPageMargin ( false ),
     124             :     bColRulerMove( false ),
     125             :     mbHasEmptyRangeTable(false),
     126             :     nLeftPosition( 0 ),
     127             :     mnScale( 0 ),
     128             :     nColNumberButttonDown( 0 ),
     129             :     nHeaderHeight ( 0 ),
     130           8 :     nFooterHeight ( 0 )
     131             : {
     132           8 :     SetOutDevViewType( OUTDEV_VIEWTYPE_PRINTPREVIEW ); //#106611#
     133           8 :     SetBackground();
     134             : 
     135           8 :     SetHelpId( HID_SC_WIN_PREVIEW );
     136           8 :     SetUniqueId( HID_SC_WIN_PREVIEW );
     137             : 
     138           8 :     SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
     139             : 
     140        8200 :     for (SCCOL i=0; i<=MAXCOL; i++)
     141        8192 :         nRight[i] = 0;                  // initialized with actual positions when markers are drawn
     142           8 : }
     143             : 
     144          24 : ScPreview::~ScPreview()
     145             : {
     146           8 :     disposeOnce();
     147          16 : }
     148             : 
     149           8 : void ScPreview::dispose()
     150             : {
     151           8 :     delete pDrawView;
     152           8 :     delete pLocationData;
     153           8 :     vcl::Window::dispose();
     154           8 : }
     155             : 
     156          16 : void ScPreview::UpdateDrawView()        // nTab must be right
     157             : {
     158          16 :     ScDocument& rDoc = pDocShell->GetDocument();
     159          16 :     ScDrawLayer* pModel = rDoc.GetDrawLayer();     // is not 0
     160             : 
     161             :     // #114135#
     162          16 :     if ( pModel )
     163             :     {
     164          16 :         SdrPage* pPage = pModel->GetPage(nTab);
     165          16 :         if ( pDrawView && ( !pDrawView->GetSdrPageView() || pDrawView->GetSdrPageView()->GetPage() != pPage ) )
     166             :         {
     167             :             //  die angezeigte Page der DrawView umzustellen (s.u.) funktioniert nicht ?!?
     168           0 :             delete pDrawView;
     169           0 :             pDrawView = NULL;
     170             :         }
     171             : 
     172          16 :         if ( !pDrawView )                                   // New Drawing?
     173             :         {
     174           8 :             pDrawView = new FmFormView( pModel, this );
     175             : 
     176             :             // The DrawView takes over the Design-Mode from the Model
     177             :             // (Settings "In opening Draftmode"), therefore to restore here
     178           8 :             pDrawView->SetDesignMode( true );
     179           8 :             pDrawView->SetPrintPreview( true );
     180           8 :             pDrawView->ShowSdrPage(pPage);
     181             :         }
     182             :     }
     183           0 :     else if ( pDrawView )
     184             :     {
     185           0 :         delete pDrawView;           // for this Chart is not needed
     186           0 :         pDrawView = NULL;
     187             :     }
     188          16 : }
     189             : 
     190          32 : void ScPreview::TestLastPage()
     191             : {
     192          32 :     if (nPageNo >= nTotalPages)
     193             :     {
     194           0 :         if (nTotalPages)
     195             :         {
     196           0 :             nPageNo = nTotalPages - 1;
     197           0 :             nTab = static_cast<SCTAB>(nPages.size()) -1;
     198           0 :             while (nTab > 0 && !nPages[nTab])       // not the last empty Table
     199           0 :                 --nTab;
     200             :             OSL_ENSURE(0 < static_cast<SCTAB>(nPages.size()),"are all tables empty?");
     201           0 :             nTabPage = nPages[nTab] - 1;
     202           0 :             nTabStart = 0;
     203           0 :             for (sal_uInt16 i=0; i<nTab; i++)
     204           0 :                 nTabStart += nPages[i];
     205             : 
     206           0 :             ScDocument& rDoc = pDocShell->GetDocument();
     207           0 :             nDisplayStart = lcl_GetDisplayStart( nTab, &rDoc, nPages );
     208             :         }
     209             :         else        // empty Document
     210             :         {
     211           0 :             nTab = 0;
     212           0 :             nPageNo = nTabPage = nTabStart = nDisplayStart = 0;
     213           0 :             aState.nPrintTab = 0;
     214           0 :                         aState.nStartCol = aState.nEndCol = 0;
     215           0 :                         aState.nStartRow = aState.nEndRow = 0;
     216           0 :                         aState.nZoom = 0;
     217           0 :             aState.nPagesX = aState.nPagesY = 0;
     218             :             aState.nTabPages = aState.nTotalPages =
     219           0 :             aState.nPageStart = aState.nDocPages = 0;
     220             :         }
     221             :     }
     222          32 : }
     223             : 
     224          16 : void ScPreview::CalcPages()
     225             : {
     226          16 :     WaitObject aWait( this );
     227             : 
     228          16 :     ScDocument& rDoc = pDocShell->GetDocument();
     229          16 :     nTabCount = rDoc.GetTableCount();
     230             : 
     231          16 :     SCTAB nStart = nTabsTested;
     232          16 :     if (!bValid)
     233             :     {
     234          16 :         nStart = 0;
     235          16 :         nTotalPages = 0;
     236          16 :         nTabsTested = 0;
     237             :     }
     238             : 
     239             :     // update all pending row heights with a single progress bar,
     240             :     // instead of a separate progress for each sheet from ScPrintFunc
     241          16 :     pDocShell->UpdatePendingRowHeights( nTabCount-1, true );
     242             : 
     243             :     //  PrintOptions is passed to PrintFunc for SkipEmpty flag,
     244             :     //  but always all sheets are used (there is no selected sheet)
     245          32 :     ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
     246             : 
     247          32 :     while (nStart > static_cast<SCTAB>(nPages.size()))
     248           0 :         nPages.push_back(0);
     249          32 :     while (nStart > static_cast<SCTAB>(nFirstAttr.size()))
     250           0 :         nFirstAttr.push_back(0);
     251             : 
     252          32 :     for (SCTAB i=nStart; i<nTabCount; i++)
     253             :     {
     254          16 :         if ( i == static_cast<SCTAB>(nPages.size()))
     255           8 :             nPages.push_back(0);
     256          16 :         if ( i == static_cast<SCTAB>(nFirstAttr.size()))
     257           8 :             nFirstAttr.push_back(0);
     258          16 :         if (!aOptions.GetAllSheets() && maSelectedTabs.count(i) == 0)
     259             :         {
     260           0 :             nPages[i] = 0;
     261           0 :             nFirstAttr[i] = 0;
     262           0 :             continue;
     263             :         }
     264             : 
     265          16 :         long nAttrPage = i > 0 ? nFirstAttr[i-1] : 1;
     266             : 
     267          16 :         long nThisStart = nTotalPages;
     268          16 :         ScPrintFunc aPrintFunc( this, pDocShell, i, nAttrPage, 0, NULL, &aOptions );
     269          16 :         long nThisTab = aPrintFunc.GetTotalPages();
     270          16 :         if (!aPrintFunc.HasPrintRange())
     271           0 :             mbHasEmptyRangeTable = true;
     272             : 
     273          16 :         nPages[i] = nThisTab;
     274          16 :         nTotalPages += nThisTab;
     275          16 :         nFirstAttr[i] = aPrintFunc.GetFirstPageNo();    // to keep or from template
     276             : 
     277          16 :         if (nPageNo>=nThisStart && nPageNo<nTotalPages)
     278             :         {
     279          16 :             nTab = i;
     280          16 :             nTabPage = nPageNo - nThisStart;
     281          16 :             nTabStart = nThisStart;
     282             : 
     283          16 :             aPrintFunc.GetPrintState( aState );
     284          16 :             aPageSize = aPrintFunc.GetPageSize();
     285             :         }
     286          16 :     }
     287             : 
     288          16 :     nDisplayStart = lcl_GetDisplayStart( nTab, &rDoc, nPages );
     289             : 
     290          16 :     if (nTabCount > nTabsTested)
     291          16 :         nTabsTested = nTabCount;
     292             : 
     293          16 :     TestLastPage();
     294             : 
     295          16 :     aState.nDocPages = nTotalPages;
     296             : 
     297          16 :     bValid = true;
     298          16 :     bStateValid = true;
     299          32 :     DoInvalidate();
     300          16 : }
     301             : 
     302          24 : void ScPreview::RecalcPages()                   // only nPageNo is changed
     303             : {
     304          24 :     if (!bValid)
     305          32 :         return;                         // then CalcPages is called
     306             : 
     307          16 :     SCTAB nOldTab = nTab;
     308             : 
     309          16 :     bool bDone = false;
     310          32 :     while (nPageNo >= nTotalPages && nTabsTested < nTabCount)
     311             :     {
     312           0 :         CalcPages();
     313           0 :         bDone = true;
     314             :     }
     315             : 
     316          16 :     if (!bDone)
     317             :     {
     318          16 :         long nPartPages = 0;
     319          32 :         for (SCTAB i=0; i<nTabsTested && nTab < static_cast<SCTAB>(nPages.size()); i++)
     320             :         {
     321          16 :             long nThisStart = nPartPages;
     322          16 :             nPartPages += nPages[i];
     323             : 
     324          16 :             if (nPageNo>=nThisStart && nPageNo<nPartPages)
     325             :             {
     326          16 :                 nTab = i;
     327          16 :                 nTabPage = nPageNo - nThisStart;
     328          16 :                 nTabStart = nThisStart;
     329             :             }
     330             :         }
     331             : 
     332          16 :         ScDocument& rDoc = pDocShell->GetDocument();
     333          16 :         nDisplayStart = lcl_GetDisplayStart( nTab, &rDoc, nPages );
     334             :     }
     335             : 
     336          16 :     TestLastPage();         // to test, if after last page
     337             : 
     338          16 :     if ( nTab != nOldTab )
     339           0 :         bStateValid = false;
     340             : 
     341          16 :     DoInvalidate();
     342             : }
     343             : 
     344          43 : void ScPreview::DoPrint( ScPreviewLocationData* pFillLocation )
     345             : {
     346          43 :     if (!bValid)
     347             :     {
     348           8 :         CalcPages();
     349           8 :         RecalcPages();
     350           8 :         UpdateDrawView();       // Spreedsheet eventually changes
     351             :     }
     352             : 
     353          43 :     Fraction aPreviewZoom( nZoom, 100 );
     354          86 :     Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
     355          86 :     MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
     356             : 
     357          43 :     bool bDoPrint = ( pFillLocation == NULL );
     358          43 :     bool bValidPage = ( nPageNo < nTotalPages );
     359             : 
     360          43 :     ScModule* pScMod = SC_MOD();
     361          43 :     const svtools::ColorConfig& rColorCfg = pScMod->GetColorConfig();
     362          43 :     Color aBackColor( rColorCfg.GetColorValue(svtools::APPBACKGROUND).nColor );
     363             : 
     364          43 :     if ( bDoPrint && ( aOffset.X() < 0 || aOffset.Y() < 0 ) && bValidPage )
     365             :     {
     366          22 :         SetMapMode( aMMMode );
     367          22 :         SetLineColor();
     368          22 :         SetFillColor(aBackColor);
     369             : 
     370          22 :         Size aWinSize = GetOutputSize();
     371          22 :         if ( aOffset.X() < 0 )
     372          22 :             DrawRect(Rectangle( 0, 0, -aOffset.X(), aWinSize.Height() ));
     373          22 :         if ( aOffset.Y() < 0 )
     374          20 :             DrawRect(Rectangle( 0, 0, aWinSize.Width(), -aOffset.Y() ));
     375             :     }
     376             : 
     377          43 :     long   nLeftMargin = 0;
     378          43 :     long   nRightMargin = 0;
     379          43 :     long   nTopMargin = 0;
     380          43 :     long   nBottomMargin = 0;
     381          43 :     bool   bHeaderOn = false;
     382          43 :     bool   bFooterOn = false;
     383             : 
     384          43 :     ScDocument& rDoc = pDocShell->GetDocument();
     385          43 :     bool   bLayoutRTL = rDoc.IsLayoutRTL( nTab );
     386             : 
     387          43 :     Size aLocalPageSize;
     388          43 :     if ( bValidPage )
     389             :     {
     390          43 :         ScPrintOptions aOptions = pScMod->GetPrintOptions();
     391             : 
     392             :         ScPrintFunc* pPrintFunc;
     393          43 :         if (bStateValid)
     394          33 :             pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
     395             :         else
     396          10 :             pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
     397             : 
     398          43 :         pPrintFunc->SetOffset(aOffset);
     399          43 :         pPrintFunc->SetManualZoom(nZoom);
     400          43 :         pPrintFunc->SetDateTime(aDate,aTime);
     401          43 :         pPrintFunc->SetClearFlag(true);
     402          43 :         pPrintFunc->SetUseStyleColor( pScMod->GetAccessOptions().GetIsForPagePreviews() );
     403             : 
     404          43 :         pPrintFunc->SetDrawView( pDrawView );
     405             : 
     406             :         // MultiSelection for the one Page must produce something inconvenient
     407          43 :         Range aPageRange( nPageNo+1, nPageNo+1 );
     408          86 :         MultiSelection aPage( aPageRange );
     409          43 :         aPage.SetTotalRange( Range(0,RANGE_MAX) );
     410          43 :         aPage.Select( aPageRange );
     411             : 
     412          43 :         long nPrinted = pPrintFunc->DoPrint( aPage, nTabStart, nDisplayStart, bDoPrint, pFillLocation );
     413             :         OSL_ENSURE(nPrinted<=1, "was'n nu los?");
     414             : 
     415          43 :         SetMapMode(aMMMode);
     416             : 
     417             :         //init nLeftMargin ... in the ScPrintFunc::InitParam!!!
     418          43 :         nLeftMargin = pPrintFunc->GetLeftMargin();
     419          43 :         nRightMargin = pPrintFunc->GetRightMargin();
     420          43 :         nTopMargin = pPrintFunc->GetTopMargin();
     421          43 :         nBottomMargin = pPrintFunc->GetBottomMargin();
     422          43 :         nHeaderHeight = pPrintFunc->GetHeader().nHeight;
     423          43 :         nFooterHeight = pPrintFunc->GetFooter().nHeight;
     424          43 :         bHeaderOn = pPrintFunc->GetHeader().bEnable;
     425          43 :         bFooterOn = pPrintFunc->GetFooter().bEnable;
     426          43 :         mnScale = pPrintFunc->GetZoom();
     427             : 
     428          43 :         if ( bDoPrint && bPageMargin && pLocationData )     // don't make use of pLocationData while filling it
     429             :         {
     430           0 :             Rectangle aPixRect;
     431           0 :             Rectangle aRectCellPosition;
     432           0 :             Rectangle aRectPosition;
     433           0 :             pLocationData->GetMainCellRange( aPageArea, aPixRect );
     434           0 :             if( !bLayoutRTL )
     435             :             {
     436           0 :                 pLocationData->GetCellPosition( aPageArea.aStart, aRectPosition );
     437           0 :                 nLeftPosition = aRectPosition.Left();
     438           0 :                 for( SCCOL i = aPageArea.aStart.Col(); i <= aPageArea.aEnd.Col(); i++ )
     439             :                 {
     440           0 :                     pLocationData->GetCellPosition( ScAddress( i,aPageArea.aStart.Row(),aPageArea.aStart.Tab()),aRectCellPosition );
     441           0 :                     nRight[i] = aRectCellPosition.Right();
     442             :                 }
     443             :             }
     444             :             else
     445             :             {
     446           0 :                 pLocationData->GetCellPosition( aPageArea.aEnd, aRectPosition );
     447           0 :                 nLeftPosition = aRectPosition.Right()+1;
     448             : 
     449           0 :                 pLocationData->GetCellPosition( aPageArea.aStart,aRectCellPosition );
     450           0 :                 nRight[ aPageArea.aEnd.Col() ] = aRectCellPosition.Left();
     451           0 :                 for( SCCOL i = aPageArea.aEnd.Col(); i > aPageArea.aStart.Col(); i-- )
     452             :                 {
     453           0 :                     pLocationData->GetCellPosition( ScAddress( i,aPageArea.aEnd.Row(),aPageArea.aEnd.Tab()),aRectCellPosition );
     454           0 :                     nRight[ i-1 ] = nRight[ i ] + aRectCellPosition.Right() - aRectCellPosition.Left() + 1;
     455             :                 }
     456             :             }
     457             :         }
     458             : 
     459          43 :         if (nPrinted)   // if not, draw everything grey
     460             :         {
     461          43 :             aLocalPageSize = pPrintFunc->GetPageSize();
     462          43 :             aLocalPageSize.Width()  = (long) (aLocalPageSize.Width()  * HMM_PER_TWIPS );
     463          43 :             aLocalPageSize.Height() = (long) (aLocalPageSize.Height() * HMM_PER_TWIPS );
     464             : 
     465          43 :             nLeftMargin = (long) ( nLeftMargin * HMM_PER_TWIPS );
     466          43 :             nRightMargin = (long) ( nRightMargin * HMM_PER_TWIPS );
     467          43 :             nTopMargin = (long) ( nTopMargin * HMM_PER_TWIPS );
     468          43 :             nBottomMargin = (long) ( nBottomMargin * HMM_PER_TWIPS );
     469          43 :             nHeaderHeight = (long) ( nHeaderHeight * HMM_PER_TWIPS * mnScale / 100 + nTopMargin );
     470          43 :             nFooterHeight = (long) ( nFooterHeight * HMM_PER_TWIPS * mnScale / 100 + nBottomMargin );
     471             :         }
     472             : 
     473          43 :         if (!bStateValid)
     474             :         {
     475          10 :             pPrintFunc->GetPrintState( aState );
     476          10 :             aState.nDocPages = nTotalPages;
     477          10 :             bStateValid = true;
     478             :         }
     479          86 :         delete pPrintFunc;
     480             :     }
     481             : 
     482          43 :     if ( bDoPrint )
     483             :     {
     484          22 :         long nPageEndX = aLocalPageSize.Width()  - aOffset.X();
     485          22 :         long nPageEndY = aLocalPageSize.Height() - aOffset.Y();
     486          22 :         if ( !bValidPage )
     487           0 :             nPageEndX = nPageEndY = 0;
     488             : 
     489          22 :         Size aWinSize = GetOutputSize();
     490          22 :         Point aWinEnd( aWinSize.Width(), aWinSize.Height() );
     491          22 :         bool bRight  = nPageEndX <= aWinEnd.X();
     492          22 :         bool bBottom = nPageEndY <= aWinEnd.Y();
     493             : 
     494          22 :         if (!nTotalPages)
     495             :         {
     496             :             // There is no data to print. Print a friendly warning message and
     497             :             // bail out.
     498             : 
     499           0 :             SetMapMode(aMMMode);
     500             : 
     501             :             // Draw background first.
     502           0 :             SetLineColor();
     503           0 :             SetFillColor(aBackColor);
     504           0 :             DrawRect(Rectangle(0, 0, aWinEnd.X(), aWinEnd.Y()));
     505             : 
     506             :             const ScPatternAttr& rDefPattern =
     507             :                 static_cast<const ScPatternAttr&>(
     508           0 :                     rDoc.GetPool()->GetDefaultItem(ATTR_PATTERN));
     509             : 
     510             :             boost::scoped_ptr<ScEditEngineDefaulter> pEditEng(
     511           0 :                 new ScEditEngineDefaulter(EditEngine::CreatePool(), true));
     512             : 
     513           0 :             pEditEng->SetRefMapMode(aMMMode);
     514           0 :             SfxItemSet* pEditDefaults = new SfxItemSet( pEditEng->GetEmptyItemSet() );
     515           0 :             rDefPattern.FillEditItemSet(pEditDefaults);
     516           0 :             pEditEng->SetDefaults(pEditDefaults, true);
     517             : 
     518           0 :             Color aTextColor(COL_LIGHTGRAY);
     519           0 :             pEditDefaults->Put(SvxColorItem(aTextColor, EE_CHAR_COLOR));
     520             : 
     521           0 :             OUString aEmptyMsg;
     522           0 :             if (mbHasEmptyRangeTable)
     523           0 :                 aEmptyMsg = ScGlobal::GetRscString(STR_PRINT_PREVIEW_EMPTY_RANGE);
     524             :             else
     525           0 :                 aEmptyMsg = ScGlobal::GetRscString(STR_PRINT_PREVIEW_NODATA);
     526             : 
     527           0 :             long nHeight = 3000;
     528           0 :             pEditEng->SetDefaultItem(SvxFontHeightItem(nHeight, 100, EE_CHAR_FONTHEIGHT));
     529           0 :             pEditEng->SetDefaultItem(SvxFontHeightItem(nHeight, 100, EE_CHAR_FONTHEIGHT_CJK));
     530           0 :             pEditEng->SetDefaultItem(SvxFontHeightItem(nHeight, 100, EE_CHAR_FONTHEIGHT_CTL));
     531             : 
     532           0 :             pEditEng->SetText(aEmptyMsg);
     533             : 
     534             :             Point aCenter(
     535           0 :                 (aWinEnd.X() - pEditEng->CalcTextWidth())/2,
     536           0 :                 (aWinEnd.Y() - pEditEng->GetTextHeight())/2);
     537             : 
     538           0 :             pEditEng->Draw(this, aCenter);
     539             : 
     540          43 :             return;
     541             :         }
     542             : 
     543          22 :         if( bPageMargin && bValidPage )
     544             :         {
     545           0 :             SetMapMode(aMMMode);
     546           0 :             SetLineColor( COL_BLACK );
     547           0 :             DrawInvert( (long)( nTopMargin - aOffset.Y() ), PointerStyle::VSizeBar );
     548           0 :             DrawInvert( (long)(nPageEndY - nBottomMargin ), PointerStyle::VSizeBar );
     549           0 :             DrawInvert( (long)( nLeftMargin - aOffset.X() ), PointerStyle::HSizeBar );
     550           0 :             DrawInvert( (long)( nPageEndX - nRightMargin ) , PointerStyle::HSizeBar );
     551           0 :             if( bHeaderOn )
     552             :             {
     553           0 :                 DrawInvert( nHeaderHeight - aOffset.Y(), PointerStyle::VSizeBar );
     554             :             }
     555           0 :             if( bFooterOn )
     556             :             {
     557           0 :                 DrawInvert( nPageEndY - nFooterHeight, PointerStyle::VSizeBar );
     558             :             }
     559             : 
     560           0 :             SetMapMode( MapMode( MAP_PIXEL ) );
     561           0 :             for( int i= aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
     562             :             {
     563           0 :                 Point aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
     564           0 :                 SetLineColor( COL_BLACK );
     565           0 :                 SetFillColor( COL_BLACK );
     566           0 :                 DrawRect( Rectangle( Point( nRight[i] - 2, aColumnTop.Y() ),Point( nRight[i] + 2 , 4 + aColumnTop.Y()) ));
     567           0 :                 DrawLine( Point( nRight[i], aColumnTop.Y() ), Point( nRight[i],  10 + aColumnTop.Y()) );
     568             :             }
     569           0 :             SetMapMode( aMMMode );
     570             :         }
     571             : 
     572          22 :         if (bRight || bBottom)
     573             :         {
     574          22 :             SetMapMode(aMMMode);
     575          22 :             SetLineColor();
     576          22 :             SetFillColor(aBackColor);
     577          22 :             if (bRight)
     578          22 :                 DrawRect(Rectangle(nPageEndX,0, aWinEnd.X(),aWinEnd.Y()));
     579          22 :             if (bBottom)
     580             :             {
     581          20 :                 if (bRight)
     582          20 :                     DrawRect(Rectangle(0,nPageEndY, nPageEndX,aWinEnd.Y()));    // Corner not duplicated
     583             :                 else
     584           0 :                     DrawRect(Rectangle(0,nPageEndY, aWinEnd.X(),aWinEnd.Y()));
     585             :             }
     586             :         }
     587             : 
     588          22 :         if ( bValidPage )
     589             :         {
     590          22 :             Color aBorderColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
     591             : 
     592             :             //  draw border
     593             : 
     594          22 :             if ( aOffset.X() <= 0 || aOffset.Y() <= 0 || bRight || bBottom )
     595             :             {
     596          22 :                 SetLineColor( aBorderColor );
     597          22 :                 SetFillColor();
     598             : 
     599          22 :                 Rectangle aPixel( LogicToPixel( Rectangle( -aOffset.X(), -aOffset.Y(), nPageEndX, nPageEndY ) ) );
     600          22 :                 --aPixel.Right();
     601          22 :                 --aPixel.Bottom();
     602          22 :                 DrawRect( PixelToLogic( aPixel ) );
     603             :             }
     604             : 
     605             :             //  draw shadow
     606             : 
     607          22 :             SetLineColor();
     608          22 :             SetFillColor( aBorderColor );
     609             : 
     610          22 :             Rectangle aPixel;
     611             : 
     612          22 :             aPixel = LogicToPixel( Rectangle( nPageEndX, -aOffset.Y(), nPageEndX, nPageEndY ) );
     613          22 :             aPixel.Top() += SC_PREVIEW_SHADOWSIZE;
     614          22 :             aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
     615          22 :             aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
     616          22 :             DrawRect( PixelToLogic( aPixel ) );
     617             : 
     618          22 :             aPixel = LogicToPixel( Rectangle( -aOffset.X(), nPageEndY, nPageEndX, nPageEndY ) );
     619          22 :             aPixel.Left() += SC_PREVIEW_SHADOWSIZE;
     620          22 :             aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
     621          22 :             aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
     622          22 :             DrawRect( PixelToLogic( aPixel ) );
     623             :         }
     624          43 :     }
     625             : }
     626             : 
     627          22 : void ScPreview::Paint( vcl::RenderContext& /*rRenderContext*/, const Rectangle& /* rRect */ )
     628             : {
     629          22 :     bool bWasInPaint = bInPaint;        // nested calls shouldn't be necessary, but allow for now
     630          22 :     bInPaint = true;
     631             : 
     632          22 :     if (bPageMargin)
     633           0 :         GetLocationData();              // fill location data for column positions
     634          22 :     DoPrint( NULL );
     635          22 :     pViewShell->UpdateScrollBars();
     636             : 
     637          22 :     bInPaint = bWasInPaint;
     638          22 : }
     639             : 
     640           0 : void ScPreview::Command( const CommandEvent& rCEvt )
     641             : {
     642           0 :     CommandEventId nCmd = rCEvt.GetCommand();
     643           0 :     if ( nCmd == CommandEventId::Wheel || nCmd == CommandEventId::StartAutoScroll || nCmd == CommandEventId::AutoScroll )
     644             :     {
     645           0 :         bool bDone = pViewShell->ScrollCommand( rCEvt );
     646           0 :         if (!bDone)
     647           0 :             Window::Command(rCEvt);
     648             :     }
     649           0 :     else if ( nCmd == CommandEventId::ContextMenu )
     650           0 :         SfxDispatcher::ExecutePopup();
     651             :     else
     652           0 :         Window::Command( rCEvt );
     653           0 : }
     654             : 
     655           0 : void ScPreview::KeyInput( const KeyEvent& rKEvt )
     656             : {
     657             :     //  The + and - keys can't be configured as accelerator entries, so they must be handled directly
     658             :     //  (in ScPreview, not ScPreviewShell -> only if the preview window has the focus)
     659             : 
     660           0 :     const vcl::KeyCode& rKeyCode = rKEvt.GetKeyCode();
     661           0 :     sal_uInt16 nKey = rKeyCode.GetCode();
     662           0 :     bool bHandled = false;
     663           0 :     if(!rKeyCode.GetModifier())
     664             :     {
     665           0 :         sal_uInt16 nSlot = 0;
     666           0 :         switch(nKey)
     667             :         {
     668           0 :             case KEY_ADD:      nSlot = SID_PREVIEW_ZOOMIN;  break;
     669           0 :             case KEY_ESCAPE:   nSlot = ScViewUtil::IsFullScreen( *pViewShell ) ? SID_CANCEL : SID_PREVIEW_CLOSE; break;
     670           0 :             case KEY_SUBTRACT: nSlot = SID_PREVIEW_ZOOMOUT; break;
     671             :         }
     672           0 :         if(nSlot)
     673             :         {
     674           0 :             bHandled = true;
     675           0 :             pViewShell->GetViewFrame()->GetDispatcher()->Execute( nSlot, SfxCallMode::ASYNCHRON );
     676             :         }
     677             :     }
     678             : 
     679           0 :     if ( !bHandled && !pViewShell->KeyInput(rKEvt) )
     680           0 :         Window::KeyInput(rKEvt);
     681           0 : }
     682             : 
     683         938 : const ScPreviewLocationData& ScPreview::GetLocationData()
     684             : {
     685         938 :     if ( !pLocationData )
     686             :     {
     687           8 :         pLocationData = new ScPreviewLocationData( &pDocShell->GetDocument(), this );
     688           8 :         bLocationValid = false;
     689             :     }
     690         938 :     if ( !bLocationValid )
     691             :     {
     692          21 :         pLocationData->Clear();
     693          21 :         DoPrint( pLocationData );
     694          21 :         bLocationValid = true;
     695             :     }
     696         938 :     return *pLocationData;
     697             : }
     698             : 
     699           8 : void ScPreview::DataChanged(bool bNewTime)
     700             : {
     701           8 :     if (bNewTime)
     702             :     {
     703           8 :         aDate = Date( Date::SYSTEM );
     704           8 :         aTime = tools::Time( tools::Time::SYSTEM );
     705             :     }
     706             : 
     707           8 :     bValid = false;
     708           8 :     InvalidateLocationData( SC_HINT_DATACHANGED );
     709           8 :     Invalidate();
     710           8 : }
     711             : 
     712          17 : OUString ScPreview::GetPosString()
     713             : {
     714          17 :     if (!bValid)
     715             :     {
     716           0 :         CalcPages();
     717           0 :         UpdateDrawView();       // The table eventually changes
     718             :     }
     719             : 
     720          34 :     OUString aString = ScGlobal::GetRscString( STR_PAGE ) +
     721          51 :                        " " + OUString::number(nPageNo+1);
     722             : 
     723          17 :     if (nTabsTested >= nTabCount)
     724          17 :         aString += " / " + OUString::number(nTotalPages);
     725             : 
     726          17 :     return aString;
     727             : }
     728             : 
     729          18 : void ScPreview::SetZoom(sal_uInt16 nNewZoom)
     730             : {
     731          18 :     if (nNewZoom < 20)
     732           0 :         nNewZoom = 20;
     733          18 :     if (nNewZoom > 400)
     734           0 :         nNewZoom = 400;
     735          18 :     if (nNewZoom != nZoom)
     736             :     {
     737          10 :         nZoom = nNewZoom;
     738             : 
     739             :         //  apply new MapMode and call UpdateScrollBars to update aOffset
     740             : 
     741          10 :         Fraction aPreviewZoom( nZoom, 100 );
     742          20 :         Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
     743          20 :         MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
     744          10 :         SetMapMode( aMMMode );
     745             : 
     746          10 :         bInSetZoom = true;              // don't scroll during SetYOffset in UpdateScrollBars
     747          10 :         pViewShell->UpdateNeededScrollBars(true);
     748          10 :         bInSetZoom = false;
     749             : 
     750          10 :         bStateValid = false;
     751          10 :         InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
     752          10 :         DoInvalidate();
     753          20 :         Invalidate();
     754             :     }
     755          18 : }
     756             : 
     757           8 : void ScPreview::SetPageNo( long nPage )
     758             : {
     759           8 :     nPageNo = nPage;
     760           8 :     RecalcPages();
     761           8 :     UpdateDrawView();       // The table eventually changes
     762           8 :     InvalidateLocationData( SC_HINT_DATACHANGED );
     763           8 :     Invalidate();
     764           8 : }
     765             : 
     766           8 : long ScPreview::GetFirstPage(SCTAB nTabP)
     767             : {
     768           8 :     SCTAB nDocTabCount = pDocShell->GetDocument().GetTableCount();
     769           8 :     if (nTabP >= nDocTabCount)
     770           0 :         nTabP = nDocTabCount-1;
     771             : 
     772           8 :     long nPage = 0;
     773           8 :     if (nTabP>0)
     774             :     {
     775           0 :         CalcPages();
     776           0 :         if (nTabP >= static_cast<SCTAB>(nPages.size()) )
     777             :             OSL_FAIL("nPages out ouf bounds, FIX IT");
     778           0 :         UpdateDrawView();       // The table eventually changes
     779             : 
     780           0 :         for (SCTAB i=0; i<nTabP; i++)
     781           0 :             nPage += nPages[i];
     782             : 
     783             :         // An empty Table on the previous Page
     784             : 
     785           0 :         if ( nPages[nTabP]==0 && nPage > 0 )
     786           0 :             --nPage;
     787             :     }
     788             : 
     789           8 :     return nPage;
     790             : }
     791             : 
     792           8 : static Size lcl_GetDocPageSize( ScDocument* pDoc, SCTAB nTab )
     793             : {
     794           8 :     OUString aName = pDoc->GetPageStyle( nTab );
     795           8 :     ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
     796           8 :     SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aName, SFX_STYLE_FAMILY_PAGE );
     797           8 :     if ( pStyleSheet )
     798             :     {
     799           8 :         SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
     800           8 :         return static_cast<const SvxSizeItem&>( rStyleSet.Get(ATTR_PAGE_SIZE)).GetSize();
     801             :     }
     802             :     else
     803             :     {
     804             :         OSL_FAIL( "PageStyle not found" );
     805           0 :         return Size();
     806           8 :     }
     807             : }
     808             : 
     809           8 : sal_uInt16 ScPreview::GetOptimalZoom(bool bWidthOnly)
     810             : {
     811           8 :     double nWinScaleX = ScGlobal::nScreenPPTX / pDocShell->GetOutputFactor();
     812           8 :     double nWinScaleY = ScGlobal::nScreenPPTY;
     813           8 :     Size aWinSize = GetOutputSizePixel();
     814             : 
     815             :     //  desired margin is 0.25cm in default MapMode (like Writer),
     816             :     //  but some additional margin is introduced by integer scale values
     817             :     //  -> add only 0.10cm, so there is some margin in all cases.
     818           8 :     Size aMarginSize( LogicToPixel( Size( 100, 100 ), MAP_100TH_MM ) );
     819           8 :     aWinSize.Width()  -= 2 * aMarginSize.Width();
     820           8 :     aWinSize.Height() -= 2 * aMarginSize.Height();
     821             : 
     822           8 :     Size aLocalPageSize = lcl_GetDocPageSize( &pDocShell->GetDocument(), nTab );
     823           8 :     if ( aLocalPageSize.Width() && aLocalPageSize.Height() )
     824             :     {
     825           8 :         long nZoomX = (long) ( aWinSize.Width() * 100  / ( aLocalPageSize.Width() * nWinScaleX ));
     826           8 :         long nZoomY = (long) ( aWinSize.Height() * 100 / ( aLocalPageSize.Height() * nWinScaleY ));
     827             : 
     828           8 :         long nOptimal = nZoomX;
     829           8 :         if (!bWidthOnly && nZoomY<nOptimal)
     830           8 :             nOptimal = nZoomY;
     831             : 
     832           8 :         if (nOptimal<20)
     833           0 :             nOptimal = 20;
     834           8 :         if (nOptimal>400)
     835           0 :             nOptimal = 400;
     836             : 
     837           8 :         return (sal_uInt16) nOptimal;
     838             :     }
     839             :     else
     840           0 :         return nZoom;
     841             : }
     842             : 
     843          40 : void ScPreview::SetXOffset( long nX )
     844             : {
     845          40 :     if ( aOffset.X() == nX )
     846          70 :         return;
     847             : 
     848          10 :     if (bValid)
     849             :     {
     850          10 :         long nDif = LogicToPixel(aOffset).X() - LogicToPixel(Point(nX,0)).X();
     851          10 :         aOffset.X() = nX;
     852          10 :         if (nDif && !bInSetZoom)
     853             :         {
     854           0 :             MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
     855           0 :             Scroll( nDif, 0 );
     856           0 :             SetMapMode(aOldMode);
     857             :         }
     858             :     }
     859             :     else
     860             :     {
     861           0 :         aOffset.X() = nX;
     862           0 :         if (!bInSetZoom)
     863           0 :             Invalidate();
     864             :     }
     865          10 :     InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
     866          10 :     Invalidate();
     867             : }
     868             : 
     869          37 : void ScPreview::SetYOffset( long nY )
     870             : {
     871          37 :     if ( aOffset.Y() == nY )
     872          65 :         return;
     873             : 
     874           9 :     if (bValid)
     875             :     {
     876           9 :         long nDif = LogicToPixel(aOffset).Y() - LogicToPixel(Point(0,nY)).Y();
     877           9 :         aOffset.Y() = nY;
     878           9 :         if (nDif && !bInSetZoom)
     879             :         {
     880           0 :             MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
     881           0 :             Scroll( 0, nDif );
     882           0 :             SetMapMode(aOldMode);
     883             :         }
     884             :     }
     885             :     else
     886             :     {
     887           0 :         aOffset.Y() = nY;
     888           0 :         if (!bInSetZoom)
     889           0 :             Invalidate();
     890             :     }
     891           9 :     InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
     892           9 :     Invalidate();
     893             : }
     894             : 
     895          42 : void ScPreview::DoInvalidate()
     896             : {
     897             :     //  If the whole GetState of the shell is called
     898             :     //  The Invalidate must come behind asynchronously
     899             : 
     900          42 :    if (bInGetState)
     901          16 :         Application::PostUserEvent( LINK( this, ScPreview, InvalidateHdl ), NULL, true );
     902             :     else
     903          26 :         StaticInvalidate();     // Immediately
     904          42 : }
     905             : 
     906          42 : void ScPreview::StaticInvalidate()
     907             : {
     908             :     //  static method, because it's called asynchronously
     909             :     //  -> must use current viewframe
     910             : 
     911          42 :     SfxViewFrame* pViewFrm = SfxViewFrame::Current();
     912          42 :     if (!pViewFrm)
     913          42 :         return;
     914             : 
     915          42 :     SfxBindings& rBindings = pViewFrm->GetBindings();
     916          42 :     rBindings.Invalidate(SID_STATUS_DOCPOS);
     917          42 :     rBindings.Invalidate(SID_ROWCOL_SELCOUNT);
     918          42 :     rBindings.Invalidate(SID_STATUS_PAGESTYLE);
     919          42 :     rBindings.Invalidate(SID_PREVIEW_PREVIOUS);
     920          42 :     rBindings.Invalidate(SID_PREVIEW_NEXT);
     921          42 :     rBindings.Invalidate(SID_PREVIEW_FIRST);
     922          42 :     rBindings.Invalidate(SID_PREVIEW_LAST);
     923          42 :     rBindings.Invalidate(SID_ATTR_ZOOM);
     924          42 :     rBindings.Invalidate(SID_PREVIEW_ZOOMIN);
     925          42 :     rBindings.Invalidate(SID_PREVIEW_ZOOMOUT);
     926          42 :     rBindings.Invalidate(SID_PREVIEW_SCALINGFACTOR);
     927          42 :     rBindings.Invalidate(SID_ATTR_ZOOMSLIDER);
     928             : }
     929             : 
     930          32 : IMPL_STATIC_LINK_NOARG( ScPreview, InvalidateHdl )
     931             : {
     932          16 :     StaticInvalidate();
     933          16 :     return 0;
     934             : }
     935             : 
     936           0 : void ScPreview::DataChanged( const DataChangedEvent& rDCEvt )
     937             : {
     938           0 :     Window::DataChanged(rDCEvt);
     939             : 
     940           0 :     if ( (rDCEvt.GetType() == DataChangedEventType::PRINTER) ||
     941           0 :          (rDCEvt.GetType() == DataChangedEventType::DISPLAY) ||
     942           0 :          (rDCEvt.GetType() == DataChangedEventType::FONTS) ||
     943           0 :          (rDCEvt.GetType() == DataChangedEventType::FONTSUBSTITUTION) ||
     944           0 :          ((rDCEvt.GetType() == DataChangedEventType::SETTINGS) &&
     945           0 :           (rDCEvt.GetFlags() & AllSettingsFlags::STYLE)) )
     946             :     {
     947           0 :         if ( rDCEvt.GetType() == DataChangedEventType::FONTS )
     948           0 :             pDocShell->UpdateFontList();
     949             : 
     950             :         // #i114518# Paint of form controls may modify the window's settings.
     951             :         // Ignore the event if it is called from within Paint.
     952           0 :         if ( !bInPaint )
     953             :         {
     954           0 :             if ( rDCEvt.GetType() == DataChangedEventType::SETTINGS &&
     955           0 :                   (rDCEvt.GetFlags() & AllSettingsFlags::STYLE) )
     956             :             {
     957             :                 //  scroll bar size may have changed
     958           0 :                 pViewShell->InvalidateBorder();     // calls OuterResizePixel
     959             :             }
     960           0 :             Invalidate();
     961           0 :             InvalidateLocationData( SC_HINT_DATACHANGED );
     962             :         }
     963             :     }
     964           0 : }
     965             : 
     966           0 : void ScPreview::MouseButtonDown( const MouseEvent& rMEvt )
     967             : {
     968           0 :     Fraction  aPreviewZoom( nZoom, 100 );
     969           0 :     Fraction  aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
     970           0 :     MapMode   aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
     971             : 
     972           0 :     aButtonDownChangePoint = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
     973           0 :     aButtonDownPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
     974             : 
     975           0 :     CaptureMouse();
     976             : 
     977           0 :     if( rMEvt.IsLeft() && GetPointer() == PointerStyle::HSizeBar )
     978             :     {
     979           0 :         SetMapMode( aMMMode );
     980           0 :         if( bLeftRulerChange )
     981             :         {
     982           0 :            DrawInvert( aButtonDownChangePoint.X(), PointerStyle::HSizeBar );
     983           0 :            bLeftRulerMove = true;
     984           0 :            bRightRulerMove = false;
     985             :         }
     986           0 :         else if( bRightRulerChange )
     987             :         {
     988           0 :            DrawInvert( aButtonDownChangePoint.X(), PointerStyle::HSizeBar );
     989           0 :            bLeftRulerMove = false;
     990           0 :            bRightRulerMove = true;
     991             :         }
     992             :     }
     993             : 
     994           0 :     if( rMEvt.IsLeft() && GetPointer() == PointerStyle::VSizeBar )
     995             :     {
     996           0 :         SetMapMode( aMMMode );
     997           0 :         if( bTopRulerChange )
     998             :         {
     999           0 :             DrawInvert( aButtonDownChangePoint.Y(), PointerStyle::VSizeBar );
    1000           0 :             bTopRulerMove = true;
    1001           0 :             bBottomRulerMove = false;
    1002             :         }
    1003           0 :         else if( bBottomRulerChange )
    1004             :         {
    1005           0 :             DrawInvert( aButtonDownChangePoint.Y(), PointerStyle::VSizeBar );
    1006           0 :             bTopRulerMove = false;
    1007           0 :             bBottomRulerMove = true;
    1008             :         }
    1009           0 :         else if( bHeaderRulerChange )
    1010             :         {
    1011           0 :             DrawInvert( aButtonDownChangePoint.Y(), PointerStyle::VSizeBar );
    1012           0 :             bHeaderRulerMove = true;
    1013           0 :             bFooterRulerMove = false;
    1014             :         }
    1015           0 :         else if( bFooterRulerChange )
    1016             :         {
    1017           0 :             DrawInvert( aButtonDownChangePoint.Y(), PointerStyle::VSizeBar );
    1018           0 :             bHeaderRulerMove = false;
    1019           0 :             bFooterRulerMove = true;
    1020             :         }
    1021             :     }
    1022             : 
    1023           0 :     if( rMEvt.IsLeft() && GetPointer() == PointerStyle::HSplit )
    1024             :     {
    1025           0 :         Point  aNowPt = rMEvt.GetPosPixel();
    1026           0 :         SCCOL i = 0;
    1027           0 :         for( i = aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
    1028             :         {
    1029           0 :             if( aNowPt.X() < nRight[i] + 2 && aNowPt.X() > nRight[i] - 2 )
    1030             :             {
    1031           0 :                 nColNumberButttonDown = i;
    1032           0 :                 break;
    1033             :             }
    1034             :         }
    1035           0 :         if( i == aPageArea.aEnd.Col()+1 )
    1036           0 :             return;
    1037             : 
    1038           0 :         SetMapMode( aMMMode );
    1039           0 :         if( nColNumberButttonDown == aPageArea.aStart.Col() )
    1040           0 :             DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,PointerStyle::HSplit );
    1041             :         else
    1042           0 :             DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,PointerStyle::HSplit );
    1043             : 
    1044           0 :         DrawInvert( aButtonDownChangePoint.X(), PointerStyle::HSplit );
    1045           0 :         bColRulerMove = true;
    1046           0 :     }
    1047             : }
    1048             : 
    1049           0 : void ScPreview::MouseButtonUp( const MouseEvent& rMEvt )
    1050             : {
    1051           0 :         Fraction  aPreviewZoom( nZoom, 100 );
    1052           0 :         Fraction  aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
    1053           0 :         MapMode   aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
    1054             : 
    1055           0 :         aButtonUpPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
    1056             : 
    1057           0 :         long  nWidth = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Width();
    1058           0 :         long  nHeight = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Height();
    1059             : 
    1060           0 :         if( rMEvt.IsLeft() && GetPointer() == PointerStyle::HSizeBar )
    1061             :         {
    1062           0 :             SetPointer( Pointer( PointerStyle::Arrow ) );
    1063             : 
    1064           0 :             ScDocument& rDoc = pDocShell->GetDocument();
    1065           0 :             OUString aOldName = rDoc.GetPageStyle( nTab );
    1066           0 :             bool bUndo = rDoc.IsUndoEnabled();
    1067           0 :             ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
    1068           0 :             SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE );
    1069             : 
    1070           0 :             if ( pStyleSheet )
    1071             :             {
    1072           0 :                 bool bMoveRulerAction= true;
    1073           0 :                 ScStyleSaveData aOldData;
    1074           0 :                 if( bUndo )
    1075           0 :                     aOldData.InitFromStyle( pStyleSheet );
    1076             : 
    1077           0 :                 SfxItemSet&  rStyleSet = pStyleSheet->GetItemSet();
    1078             : 
    1079           0 :                 SvxLRSpaceItem aLRItem = static_cast<const SvxLRSpaceItem&>( rStyleSet.Get( ATTR_LRSPACE ) );
    1080             : 
    1081           0 :                 if(( bLeftRulerChange || bRightRulerChange ) && ( aButtonUpPt.X() <= ( 0 - aOffset.X() ) || aButtonUpPt.X() > nWidth * HMM_PER_TWIPS - aOffset.X() ) )
    1082             :                 {
    1083           0 :                     bMoveRulerAction = false;
    1084           0 :                     Invalidate(Rectangle(0, 0, 10000, 10000));
    1085             :                 }
    1086           0 :                 else if( bLeftRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS > nWidth - aLRItem.GetRight() - aOffset.X() / HMM_PER_TWIPS ) )
    1087             :                 {
    1088           0 :                     bMoveRulerAction = false;
    1089           0 :                     Invalidate(Rectangle(0, 0, 10000, 10000));
    1090             :                 }
    1091           0 :                 else if( bRightRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS < aLRItem.GetLeft() - aOffset.X() / HMM_PER_TWIPS ) )
    1092             :                 {
    1093           0 :                     bMoveRulerAction = false;
    1094           0 :                     Invalidate(Rectangle(0, 0, 10000, 10000));
    1095             :                 }
    1096           0 :                 else if( aButtonDownPt.X() == aButtonUpPt.X() )
    1097             :                 {
    1098           0 :                     bMoveRulerAction = false;
    1099           0 :                     DrawInvert( aButtonUpPt.X(), PointerStyle::HSizeBar );
    1100             :                 }
    1101           0 :                 if( bMoveRulerAction )
    1102             :                 {
    1103           0 :                     ScDocShellModificator aModificator( *pDocShell );
    1104           0 :                     if( bLeftRulerChange && bLeftRulerMove )
    1105             :                     {
    1106           0 :                        aLRItem.SetLeft( (long)( aButtonUpPt.X() / HMM_PER_TWIPS + aOffset.X() / HMM_PER_TWIPS ));
    1107           0 :                        rStyleSet.Put( aLRItem );
    1108           0 :                        pDocShell->SetModified(true);
    1109             :                     }
    1110           0 :                     else if( bRightRulerChange && bRightRulerMove )
    1111             :                     {
    1112           0 :                         aLRItem.SetRight( (long)( nWidth - aButtonUpPt.X() / HMM_PER_TWIPS - aOffset.X() / HMM_PER_TWIPS ));
    1113           0 :                         rStyleSet.Put( aLRItem );
    1114           0 :                         pDocShell->SetModified(true);
    1115             :                     }
    1116             : 
    1117           0 :                     ScStyleSaveData aNewData;
    1118           0 :                     aNewData.InitFromStyle( pStyleSheet );
    1119           0 :                     if( bUndo )
    1120             :                     {
    1121           0 :                         pDocShell->GetUndoManager()->AddUndoAction(
    1122             :                             new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
    1123           0 :                             aOldData, aNewData ) );
    1124             :                     }
    1125             : 
    1126           0 :                     if ( ValidTab( nTab ) )
    1127             :                     {
    1128           0 :                         ScPrintFunc aPrintFunc( this, pDocShell, nTab );
    1129           0 :                         aPrintFunc.UpdatePages();
    1130             :                     }
    1131             : 
    1132           0 :                     Rectangle aRect(0,0,10000,10000);
    1133           0 :                     Invalidate(aRect);
    1134           0 :                     aModificator.SetDocumentModified();
    1135           0 :                     bLeftRulerChange = false;
    1136           0 :                     bRightRulerChange = false;
    1137           0 :                 }
    1138             :             }
    1139           0 :             bLeftRulerMove = false;
    1140           0 :             bRightRulerMove = false;
    1141             :         }
    1142             : 
    1143           0 :         if( rMEvt.IsLeft() && GetPointer() == PointerStyle::VSizeBar )
    1144             :         {
    1145           0 :             SetPointer( PointerStyle::Arrow );
    1146             : 
    1147           0 :             bool bMoveRulerAction = true;
    1148           0 :             if( ( bTopRulerChange || bBottomRulerChange || bHeaderRulerChange || bFooterRulerChange ) && ( aButtonUpPt.Y() <= ( 0 - aOffset.Y() ) || aButtonUpPt.Y() > nHeight * HMM_PER_TWIPS -aOffset.Y() ) )
    1149             :             {
    1150           0 :                 bMoveRulerAction = false;
    1151           0 :                 Invalidate(Rectangle(0, 0, 10000, 10000));
    1152             :             }
    1153           0 :             else if( aButtonDownPt.Y() == aButtonUpPt.Y() )
    1154             :             {
    1155           0 :                 bMoveRulerAction = false;
    1156           0 :                 DrawInvert( aButtonUpPt.Y(), PointerStyle::VSizeBar );
    1157             :             }
    1158           0 :             if( bMoveRulerAction )
    1159             :             {
    1160           0 :                 ScDocument& rDoc = pDocShell->GetDocument();
    1161           0 :                 bool bUndo = rDoc.IsUndoEnabled();
    1162           0 :                 ScStyleSheetPool* pStylePool = rDoc.GetStyleSheetPool();
    1163           0 :                 SfxStyleSheetBase* pStyleSheet = pStylePool->Find( rDoc.GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE );
    1164             :                 OSL_ENSURE( pStyleSheet, "PageStyle not found" );
    1165           0 :                 if ( pStyleSheet )
    1166             :                 {
    1167           0 :                     ScDocShellModificator aModificator( *pDocShell );
    1168           0 :                     ScStyleSaveData aOldData;
    1169           0 :                     if( bUndo )
    1170           0 :                         aOldData.InitFromStyle( pStyleSheet );
    1171             : 
    1172           0 :                     SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
    1173             : 
    1174           0 :                     SvxULSpaceItem aULItem = static_cast<const SvxULSpaceItem&>( rStyleSet.Get( ATTR_ULSPACE ) );
    1175             : 
    1176           0 :                     if( bTopRulerMove && bTopRulerChange )
    1177             :                     {
    1178           0 :                         aULItem.SetUpperValue( (sal_uInt16)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS ) );
    1179           0 :                         rStyleSet.Put( aULItem );
    1180           0 :                         pDocShell->SetModified(true);
    1181             :                     }
    1182           0 :                     else if( bBottomRulerMove && bBottomRulerChange )
    1183             :                     {
    1184           0 :                         aULItem.SetLowerValue( (sal_uInt16)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS ) );
    1185           0 :                         rStyleSet.Put( aULItem );
    1186           0 :                         pDocShell->SetModified(true);
    1187             :                     }
    1188           0 :                     else if( bHeaderRulerMove && bHeaderRulerChange )
    1189             :                     {
    1190           0 :                         const SfxPoolItem* pItem = NULL;
    1191           0 :                         if ( rStyleSet.GetItemState( ATTR_PAGE_HEADERSET, false, &pItem ) == SfxItemState::SET )
    1192             :                         {
    1193           0 :                             const SfxItemSet& pHeaderSet = static_cast<const SvxSetItem*>(pItem)->GetItemSet();
    1194           0 :                             Size  aHeaderSize = static_cast<const SvxSizeItem&>(pHeaderSet.Get(ATTR_PAGE_SIZE)).GetSize();
    1195           0 :                             aHeaderSize.Height() = (long)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS - aULItem.GetUpper());
    1196           0 :                             aHeaderSize.Height() = aHeaderSize.Height() * 100 / mnScale;
    1197           0 :                             SvxSetItem  aNewHeader( static_cast<const SvxSetItem&>(rStyleSet.Get(ATTR_PAGE_HEADERSET)) );
    1198           0 :                             aNewHeader.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aHeaderSize ) );
    1199           0 :                             rStyleSet.Put( aNewHeader );
    1200           0 :                             pDocShell->SetModified(true);
    1201           0 :                         }
    1202             :                     }
    1203           0 :                     else if( bFooterRulerMove && bFooterRulerChange )
    1204             :                     {
    1205           0 :                         const SfxPoolItem* pItem = NULL;
    1206           0 :                         if( rStyleSet.GetItemState( ATTR_PAGE_FOOTERSET, false, &pItem ) == SfxItemState::SET )
    1207             :                         {
    1208           0 :                             const SfxItemSet& pFooterSet = static_cast<const SvxSetItem*>(pItem)->GetItemSet();
    1209           0 :                             Size aFooterSize = static_cast<const SvxSizeItem&>(pFooterSet.Get(ATTR_PAGE_SIZE)).GetSize();
    1210           0 :                             aFooterSize.Height() = (long)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS - aULItem.GetLower() );
    1211           0 :                             aFooterSize.Height() = aFooterSize.Height() * 100 / mnScale;
    1212           0 :                             SvxSetItem  aNewFooter( static_cast<const SvxSetItem&>(rStyleSet.Get(ATTR_PAGE_FOOTERSET)) );
    1213           0 :                             aNewFooter.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aFooterSize ) );
    1214           0 :                             rStyleSet.Put( aNewFooter );
    1215           0 :                             pDocShell->SetModified(true);
    1216             :                         }
    1217             :                     }
    1218             : 
    1219           0 :                     ScStyleSaveData aNewData;
    1220           0 :                     aNewData.InitFromStyle( pStyleSheet );
    1221           0 :                     if( bUndo )
    1222             :                     {
    1223           0 :                         pDocShell->GetUndoManager()->AddUndoAction(
    1224             :                             new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
    1225           0 :                             aOldData, aNewData ) );
    1226             :                     }
    1227             : 
    1228           0 :                     if ( ValidTab( nTab ) )
    1229             :                     {
    1230           0 :                         ScPrintFunc aPrintFunc( this, pDocShell, nTab );
    1231           0 :                         aPrintFunc.UpdatePages();
    1232             :                     }
    1233             : 
    1234           0 :                     Rectangle aRect(0, 0, 10000, 10000);
    1235           0 :                     Invalidate(aRect);
    1236           0 :                     aModificator.SetDocumentModified();
    1237           0 :                     bTopRulerChange = false;
    1238           0 :                     bBottomRulerChange = false;
    1239           0 :                     bHeaderRulerChange = false;
    1240           0 :                     bFooterRulerChange = false;
    1241             :                  }
    1242             :               }
    1243           0 :               bTopRulerMove = false;
    1244           0 :               bBottomRulerMove = false;
    1245           0 :               bHeaderRulerMove = false;
    1246           0 :               bFooterRulerMove = false;
    1247             :         }
    1248           0 :         if( rMEvt.IsLeft() && GetPointer() == PointerStyle::HSplit )
    1249             :         {
    1250           0 :             SetPointer(PointerStyle::Arrow);
    1251           0 :             ScDocument& rDoc = pDocShell->GetDocument();
    1252           0 :             bool bLayoutRTL = rDoc.IsLayoutRTL( nTab );
    1253           0 :             bool bMoveRulerAction = true;
    1254           0 :             if( aButtonDownPt.X() == aButtonUpPt.X() )
    1255             :             {
    1256           0 :                 bMoveRulerAction = false;
    1257           0 :                 if( nColNumberButttonDown == aPageArea.aStart.Col() )
    1258           0 :                     DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,PointerStyle::HSplit );
    1259             :                 else
    1260           0 :                     DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,PointerStyle::HSplit );
    1261           0 :                 DrawInvert( aButtonUpPt.X(), PointerStyle::HSplit );
    1262             :             }
    1263           0 :             if( bMoveRulerAction )
    1264             :             {
    1265           0 :                 long  nNewColWidth = 0;
    1266           0 :                 std::vector<sc::ColRowSpan> aCols(1, sc::ColRowSpan(nColNumberButttonDown,nColNumberButttonDown));
    1267             : 
    1268           0 :                 if( !bLayoutRTL )
    1269             :                 {
    1270           0 :                     nNewColWidth = (long) ( PixelToLogic( Point( rMEvt.GetPosPixel().X() - nRight[ nColNumberButttonDown ], 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
    1271           0 :                     nNewColWidth += pDocShell->GetDocument().GetColWidth( nColNumberButttonDown, nTab );
    1272             :                 }
    1273             :                 else
    1274             :                 {
    1275             : 
    1276           0 :                     nNewColWidth = (long) ( PixelToLogic( Point( nRight[ nColNumberButttonDown ] - rMEvt.GetPosPixel().X(), 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
    1277           0 :                     nNewColWidth += pDocShell->GetDocument().GetColWidth( nColNumberButttonDown, nTab );
    1278             :                 }
    1279             : 
    1280           0 :                 if( nNewColWidth >= 0 )
    1281             :                 {
    1282           0 :                     pDocShell->GetDocFunc().SetWidthOrHeight(
    1283           0 :                         true, aCols, nTab, SC_SIZE_DIRECT, (sal_uInt16)nNewColWidth, true, true);
    1284           0 :                     pDocShell->SetModified(true);
    1285             :                 }
    1286           0 :                 if ( ValidTab( nTab ) )
    1287             :                 {
    1288           0 :                     ScPrintFunc aPrintFunc( this, pDocShell, nTab );
    1289           0 :                     aPrintFunc.UpdatePages();
    1290             :                 }
    1291           0 :                 Rectangle aRect(0, 0, 10000, 10000);
    1292           0 :                 Invalidate(aRect);
    1293             :             }
    1294           0 :             bColRulerMove = false;
    1295             :         }
    1296           0 :         ReleaseMouse();
    1297           0 : }
    1298             : 
    1299           0 : void ScPreview::MouseMove( const MouseEvent& rMEvt )
    1300             : {
    1301           0 :     Fraction aPreviewZoom( nZoom, 100 );
    1302           0 :     Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
    1303           0 :     MapMode  aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
    1304           0 :     Point    aMouseMovePoint = PixelToLogic( rMEvt.GetPosPixel(), aMMMode );
    1305             : 
    1306           0 :     long    nLeftMargin = 0;
    1307           0 :     long    nRightMargin = 0;
    1308           0 :     long    nTopMargin = 0;
    1309           0 :     long    nBottomMargin = 0;
    1310             : 
    1311           0 :     long    nWidth = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Width();
    1312           0 :     long    nHeight = (long) lcl_GetDocPageSize(&pDocShell->GetDocument(), nTab).Height();
    1313             : 
    1314           0 :     if ( nPageNo < nTotalPages )
    1315             :     {
    1316           0 :         ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
    1317             : 
    1318             :         ScPrintFunc* pPrintFunc;
    1319             : 
    1320           0 :         if (bStateValid)
    1321           0 :             pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
    1322             :         else
    1323           0 :             pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
    1324             : 
    1325           0 :         nLeftMargin = (long)( pPrintFunc->GetLeftMargin() * HMM_PER_TWIPS - aOffset.X() );
    1326           0 :         nRightMargin = (long)( pPrintFunc->GetRightMargin() * HMM_PER_TWIPS );
    1327           0 :         nRightMargin = (long)( nWidth * HMM_PER_TWIPS - nRightMargin - aOffset.X() );
    1328           0 :         nTopMargin = (long)( pPrintFunc->GetTopMargin() * HMM_PER_TWIPS - aOffset.Y() );
    1329           0 :         nBottomMargin = (long)( pPrintFunc->GetBottomMargin() * HMM_PER_TWIPS );
    1330           0 :         nBottomMargin = (long)( nHeight * HMM_PER_TWIPS - nBottomMargin - aOffset.Y() );
    1331           0 :         if( mnScale > 0 )
    1332             :         {
    1333           0 :             nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS * mnScale / 100 );
    1334           0 :             nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS * mnScale / 100 );
    1335             :         }
    1336             :         else
    1337             :         {
    1338           0 :             nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS );
    1339           0 :             nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS );
    1340             :         }
    1341           0 :         delete pPrintFunc;
    1342             :     }
    1343             : 
    1344           0 :     Point   aPixPt( rMEvt.GetPosPixel() );
    1345           0 :     Point   aLeftTop = LogicToPixel( Point( nLeftMargin, -aOffset.Y() ) , aMMMode );
    1346           0 :     Point   aLeftBottom = LogicToPixel( Point( nLeftMargin ,(long)(nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
    1347           0 :     Point   aRightTop = LogicToPixel( Point( nRightMargin, -aOffset.Y() ), aMMMode );
    1348           0 :     Point   aTopLeft = LogicToPixel( Point( -aOffset.X(), nTopMargin ), aMMMode );
    1349           0 :     Point   aTopRight = LogicToPixel( Point( (long)(nWidth * HMM_PER_TWIPS - aOffset.X()), nTopMargin ), aMMMode );
    1350           0 :     Point   aBottomLeft = LogicToPixel( Point( -aOffset.X(), nBottomMargin ), aMMMode );
    1351           0 :     Point   aHeaderLeft = LogicToPixel( Point(  -aOffset.X(), nHeaderHeight ), aMMMode );
    1352           0 :     Point   aFooderLeft = LogicToPixel( Point( -aOffset.X(), nFooterHeight ), aMMMode );
    1353             : 
    1354           0 :     bool bOnColRulerChange = false;
    1355             : 
    1356           0 :     for( SCCOL i=aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
    1357             :     {
    1358           0 :         Point   aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
    1359           0 :         Point   aColumnBottom = LogicToPixel( Point( 0, (long)( nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
    1360           0 :         if( aPixPt.X() < ( nRight[i] + 2 ) && ( aPixPt.X() > ( nRight[i] - 2 ) ) && ( aPixPt.X() < aRightTop.X() ) && ( aPixPt.X() > aLeftTop.X() )
    1361           0 :             && ( aPixPt.Y() > aColumnTop.Y() ) && ( aPixPt.Y() < aColumnBottom.Y() ) && !bLeftRulerMove && !bRightRulerMove
    1362           0 :             && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
    1363             :         {
    1364           0 :             bOnColRulerChange = true;
    1365           0 :             if( !rMEvt.GetButtons() && GetPointer() == PointerStyle::HSplit )
    1366           0 :                 nColNumberButttonDown = i;
    1367           0 :             break;
    1368             :         }
    1369             :     }
    1370             : 
    1371           0 :     if( aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 ) && !bRightRulerMove )
    1372             :     {
    1373           0 :         bLeftRulerChange = true;
    1374           0 :         bRightRulerChange = false;
    1375             :     }
    1376           0 :     else if( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) && !bLeftRulerMove )
    1377             :     {
    1378           0 :         bLeftRulerChange = false;
    1379           0 :         bRightRulerChange = true;
    1380             :     }
    1381           0 :     else if( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
    1382             :     {
    1383           0 :         bTopRulerChange = true;
    1384           0 :         bBottomRulerChange = false;
    1385           0 :         bHeaderRulerChange = false;
    1386           0 :         bFooterRulerChange = false;
    1387             :     }
    1388           0 :     else if( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) && !bTopRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
    1389             :     {
    1390           0 :         bTopRulerChange = false;
    1391           0 :         bBottomRulerChange = true;
    1392           0 :         bHeaderRulerChange = false;
    1393           0 :         bFooterRulerChange = false;
    1394             :     }
    1395           0 :     else if( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bFooterRulerMove )
    1396             :     {
    1397           0 :         bTopRulerChange = false;
    1398           0 :         bBottomRulerChange = false;
    1399           0 :         bHeaderRulerChange = true;
    1400           0 :         bFooterRulerChange = false;
    1401             :     }
    1402           0 :     else if( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove )
    1403             :     {
    1404           0 :         bTopRulerChange = false;
    1405           0 :         bBottomRulerChange = false;
    1406           0 :         bHeaderRulerChange = false;
    1407           0 :         bFooterRulerChange = true;
    1408             :     }
    1409             : 
    1410           0 :     if( bPageMargin )
    1411             :     {
    1412           0 :         if(( (aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 )) || bLeftRulerMove ||
    1413           0 :             ( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) ) || bRightRulerMove || bOnColRulerChange || bColRulerMove )
    1414           0 :             && aPixPt.Y() > aLeftTop.Y() && aPixPt.Y() < aLeftBottom.Y() )
    1415             :         {
    1416           0 :             if( bOnColRulerChange || bColRulerMove )
    1417             :             {
    1418           0 :                 SetPointer( Pointer( PointerStyle::HSplit ) );
    1419           0 :                 if( bColRulerMove )
    1420             :                 {
    1421           0 :                     if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
    1422           0 :                        DragMove( aMouseMovePoint.X(), PointerStyle::HSplit );
    1423             :                 }
    1424             :             }
    1425             :             else
    1426             :             {
    1427           0 :                 if( bLeftRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
    1428             :                 {
    1429           0 :                     SetPointer( Pointer( PointerStyle::HSizeBar ) );
    1430           0 :                     if( bLeftRulerMove )
    1431             :                     {
    1432           0 :                        if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
    1433           0 :                            DragMove( aMouseMovePoint.X(), PointerStyle::HSizeBar );
    1434             :                     }
    1435             :                 }
    1436           0 :                 else if( bRightRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
    1437             :                 {
    1438           0 :                     SetPointer( Pointer( PointerStyle::HSizeBar ) );
    1439           0 :                     if( bRightRulerMove )
    1440             :                     {
    1441           0 :                        if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
    1442           0 :                            DragMove( aMouseMovePoint.X(), PointerStyle::HSizeBar );
    1443             :                     }
    1444             :                 }
    1445             :             }
    1446             :         }
    1447             :         else
    1448             :         {
    1449           0 :             if( ( ( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) ) || bTopRulerMove ||
    1450           0 :                 ( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) ) || bBottomRulerMove ||
    1451           0 :                 ( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) ) || bHeaderRulerMove ||
    1452           0 :                 ( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) ) || bFooterRulerMove )
    1453           0 :                 && aPixPt.X() > aTopLeft.X() && aPixPt.X() < aTopRight.X() )
    1454             :             {
    1455           0 :                 if( bTopRulerChange )
    1456             :                 {
    1457           0 :                     SetPointer( Pointer( PointerStyle::VSizeBar ) );
    1458           0 :                     if( bTopRulerMove )
    1459             :                     {
    1460           0 :                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
    1461           0 :                             DragMove( aMouseMovePoint.Y(), PointerStyle::VSizeBar );
    1462             :                     }
    1463             :                 }
    1464           0 :                 else if( bBottomRulerChange )
    1465             :                 {
    1466           0 :                     SetPointer( Pointer( PointerStyle::VSizeBar ) );
    1467           0 :                     if( bBottomRulerMove )
    1468             :                     {
    1469           0 :                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
    1470           0 :                             DragMove( aMouseMovePoint.Y(), PointerStyle::VSizeBar );
    1471             :                     }
    1472             :                 }
    1473           0 :                 else if( bHeaderRulerChange )
    1474             :                 {
    1475           0 :                     SetPointer( Pointer( PointerStyle::VSizeBar ) );
    1476           0 :                     if( bHeaderRulerMove )
    1477             :                     {
    1478           0 :                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
    1479           0 :                             DragMove( aMouseMovePoint.Y(), PointerStyle::VSizeBar );
    1480             :                     }
    1481             :                 }
    1482           0 :                 else if( bFooterRulerChange )
    1483             :                 {
    1484           0 :                     SetPointer( Pointer( PointerStyle::VSizeBar ) );
    1485           0 :                     if( bFooterRulerMove )
    1486             :                     {
    1487           0 :                         if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
    1488           0 :                             DragMove( aMouseMovePoint.Y(), PointerStyle::VSizeBar );
    1489             :                     }
    1490             :                 }
    1491             :             }
    1492             :             else
    1493           0 :                 SetPointer( Pointer( PointerStyle::Arrow ) );
    1494             :         }
    1495           0 :     }
    1496           0 : }
    1497             : 
    1498          45 : void ScPreview::InvalidateLocationData(sal_uLong nId)
    1499             : {
    1500          45 :     bLocationValid = false;
    1501          45 :     if (pViewShell->HasAccessibilityObjects())
    1502          13 :         pViewShell->BroadcastAccessibility( SfxSimpleHint( nId ) );
    1503          45 : }
    1504             : 
    1505           8 : void ScPreview::GetFocus()
    1506             : {
    1507           8 :     Window::GetFocus();
    1508           8 :     if (pViewShell && pViewShell->HasAccessibilityObjects())
    1509           0 :         pViewShell->BroadcastAccessibility( ScAccWinFocusGotHint(GetAccessible()) );
    1510           8 : }
    1511             : 
    1512           8 : void ScPreview::LoseFocus()
    1513             : {
    1514           8 :     if (pViewShell && pViewShell->HasAccessibilityObjects())
    1515           8 :         pViewShell->BroadcastAccessibility( ScAccWinFocusLostHint(GetAccessible()) );
    1516           8 :     Window::LoseFocus();
    1517           8 : }
    1518             : 
    1519           8 : com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> ScPreview::CreateAccessible()
    1520             : {
    1521           8 :     com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> xAcc= GetAccessible(false);
    1522           8 :     if (xAcc.is())
    1523             :     {
    1524           0 :         return xAcc;
    1525             :     }
    1526             : 
    1527             :     ScAccessibleDocumentPagePreview* pAccessible =
    1528           8 :         new ScAccessibleDocumentPagePreview( GetAccessibleParentWindow()->GetAccessible(), pViewShell );
    1529             : 
    1530           8 :     xAcc = pAccessible;
    1531           8 :     SetAccessible(xAcc);
    1532           8 :     pAccessible->Init();
    1533           8 :     return xAcc;
    1534             : }
    1535             : 
    1536           0 : void ScPreview::DragMove( long nDragMovePos, PointerStyle nFlags )
    1537             : {
    1538           0 :     Fraction aPreviewZoom( nZoom, 100 );
    1539           0 :     Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
    1540           0 :     MapMode  aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
    1541           0 :     SetMapMode( aMMMode );
    1542           0 :     long  nPos = nDragMovePos;
    1543           0 :     if( nFlags == PointerStyle::HSizeBar || nFlags == PointerStyle::HSplit )
    1544             :     {
    1545           0 :         if( nDragMovePos != aButtonDownChangePoint.X() )
    1546             :         {
    1547           0 :             DrawInvert( aButtonDownChangePoint.X(), nFlags );
    1548           0 :             aButtonDownChangePoint.X() = nPos;
    1549           0 :             DrawInvert( aButtonDownChangePoint.X(), nFlags );
    1550             :         }
    1551             :     }
    1552           0 :     else if( nFlags == PointerStyle::VSizeBar )
    1553             :     {
    1554           0 :         if( nDragMovePos != aButtonDownChangePoint.Y() )
    1555             :         {
    1556           0 :             DrawInvert( aButtonDownChangePoint.Y(), nFlags );
    1557           0 :             aButtonDownChangePoint.Y() = nPos;
    1558           0 :             DrawInvert( aButtonDownChangePoint.Y(), nFlags );
    1559             :         }
    1560           0 :     }
    1561           0 : }
    1562             : 
    1563           0 : void ScPreview::DrawInvert( long nDragPos, PointerStyle nFlags )
    1564             : {
    1565           0 :     long  nHeight = (long) lcl_GetDocPageSize( &pDocShell->GetDocument(), nTab ).Height();
    1566           0 :     long  nWidth = (long) lcl_GetDocPageSize( &pDocShell->GetDocument(), nTab ).Width();
    1567           0 :     if( nFlags == PointerStyle::HSizeBar || nFlags == PointerStyle::HSplit )
    1568             :     {
    1569           0 :         Rectangle aRect( nDragPos, -aOffset.Y(), nDragPos + 1,(long)( ( nHeight * HMM_PER_TWIPS ) - aOffset.Y()));
    1570           0 :         Invert( aRect, InvertFlags::N50 );
    1571             :     }
    1572           0 :     else if( nFlags == PointerStyle::VSizeBar )
    1573             :     {
    1574           0 :         Rectangle aRect( -aOffset.X(), nDragPos,(long)( ( nWidth * HMM_PER_TWIPS ) - aOffset.X() ), nDragPos + 1 );
    1575           0 :         Invert( aRect, InvertFlags::N50 );
    1576             :     }
    1577           0 : }
    1578             : 
    1579           8 : void ScPreview::SetSelectedTabs(const ScMarkData& rMark)
    1580             : {
    1581           8 :     maSelectedTabs = rMark.GetSelectedTabs();
    1582         164 : }
    1583             : 
    1584             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11