blob: 244da615809f0fc61e70c21ec309a220d97d3dd2 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_sc.hxx"
// INCLUDE ---------------------------------------------------------------
#include <tools/pstm.hxx>
#include "scitems.hxx"
#include <editeng/eeitem.hxx>
#include <svtools/colorcfg.hxx>
#include <svx/fmview.hxx>
#include <editeng/sizeitem.hxx>
#include <svx/svdpagv.hxx>
#include <sfx2/bindings.hxx>
#include <sfx2/viewfrm.hxx>
#include <sfx2/dispatch.hxx>
#include <svtools/accessibilityoptions.hxx>
#include <svl/itemset.hxx>
#include <tools/multisel.hxx>
#include <vcl/waitobj.hxx>
#include <vcl/sound.hxx>
#include "preview.hxx"
#include "prevwsh.hxx"
#include "prevloc.hxx"
#include "docsh.hxx"
#include "docfunc.hxx"
#include "printfun.hxx"
#include "printopt.hxx"
#include "stlpool.hxx"
#include "undostyl.hxx"
#include "drwlayer.hxx"
#include "scmod.hxx"
#include "globstr.hrc"
#include "sc.hrc" // fuer ShellInvalidate
#include "AccessibleDocumentPagePreview.hxx"
#include <vcl/lineinfo.hxx>
#include <svx/algitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/sizeitem.hxx>
#include "attrib.hxx"
#include "pagepar.hxx"
#include <com/sun/star/accessibility/XAccessible.hpp>
#include "AccessibilityHints.hxx"
#include <vcl/svapp.hxx>
#include "viewutil.hxx"
// STATIC DATA -----------------------------------------------------------
//==================================================================
#define SC_PREVIEW_SHADOWSIZE 2
long lcl_GetDisplayStart( SCTAB nTab, ScDocument* pDoc, long* pPages )
{
long nDisplayStart = 0;
for (SCTAB i=0; i<nTab; i++)
{
if ( pDoc->NeedPageResetAfterTab(i) )
nDisplayStart = 0;
else
nDisplayStart += pPages[i];
}
return nDisplayStart;
}
ScPreview::ScPreview( Window* pParent, ScDocShell* pDocSh, ScPreviewShell* pViewSh ) :
Window( pParent ),
nPageNo( 0 ),
nZoom( 100 ),
bValid( sal_False ),
nTabsTested( 0 ),
nTab( 0 ),
nTabStart( 0 ),
nDisplayStart( 0 ),
nTotalPages( 0 ),
bStateValid( sal_False ),
bLocationValid( sal_False ),
pLocationData( NULL ),
pDrawView( NULL ),
bInPaint( false ),
bInSetZoom( false ),
bInGetState( sal_False ),
pDocShell( pDocSh ),
pViewShell( pViewSh ),
bLeftRulerMove( sal_False ),
bRightRulerMove( sal_False ),
bTopRulerMove( sal_False ),
bBottomRulerMove( sal_False ),
bHeaderRulerMove( sal_False ),
bFooterRulerMove( sal_False ),
bLeftRulerChange( sal_False ),
bRightRulerChange( sal_False ),
bTopRulerChange( sal_False ),
bBottomRulerChange( sal_False ),
bHeaderRulerChange( sal_False ),
bFooterRulerChange( sal_False ),
bPageMargin ( sal_False ),
bColRulerMove( sal_False ),
mnScale( 0 ),
nColNumberButttonDown( 0 ),
nHeaderHeight ( 0 ),
nFooterHeight ( 0 )
{
SetOutDevViewType( OUTDEV_VIEWTYPE_PRINTPREVIEW ); //#106611#
SetBackground();
SetHelpId( HID_SC_WIN_PREVIEW );
SetUniqueId( HID_SC_WIN_PREVIEW );
SetDigitLanguage( SC_MOD()->GetOptDigitLanguage() );
for (SCCOL i=0; i<=MAXCOL; i++)
nRight[i] = 0; // initialized with actual positions when markers are drawn
}
__EXPORT ScPreview::~ScPreview()
{
delete pDrawView;
delete pLocationData;
}
void ScPreview::UpdateDrawView() // nTab muss richtig sein
{
ScDocument* pDoc = pDocShell->GetDocument();
ScDrawLayer* pModel = pDoc->GetDrawLayer(); // ist nicht 0
// #114135#
if ( pModel )
{
SdrPage* pPage = pModel->GetPage(nTab);
if ( pDrawView && ( !pDrawView->GetSdrPageView() || pDrawView->GetSdrPageView()->GetPage() != pPage ) )
{
// die angezeigte Page der DrawView umzustellen (s.u.) funktioniert nicht ?!?
delete pDrawView;
pDrawView = NULL;
}
if ( !pDrawView ) // neu anlegen?
{
pDrawView = new FmFormView( pModel, this );
// #55259# die DrawView uebernimmt den Design-Modus vom Model
// (Einstellung "Im Entwurfsmodus oeffnen"), darum hier zuruecksetzen
pDrawView->SetDesignMode( sal_True );
pDrawView->SetPrintPreview( sal_True );
pDrawView->ShowSdrPage(pPage);
}
#if 0
else if ( !pDrawView->GetSdrPageView()) // angezeigte Page umstellen
{
pDrawView->HideSdrPage();
pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
}
#endif
}
else if ( pDrawView )
{
delete pDrawView; // fuer diese Tabelle nicht gebraucht
pDrawView = NULL;
}
}
void ScPreview::TestLastPage()
{
if (nPageNo >= nTotalPages)
{
if (nTotalPages)
{
nPageNo = nTotalPages - 1;
nTab = nTabCount - 1;
while (nTab > 0 && !nPages[nTab]) // letzte nicht leere Tabelle
--nTab;
DBG_ASSERT(nPages[nTab],"alle Tabellen leer?");
nTabPage = nPages[nTab] - 1;
nTabStart = 0;
for (sal_uInt16 i=0; i<nTab; i++)
nTabStart += nPages[i];
ScDocument* pDoc = pDocShell->GetDocument();
nDisplayStart = lcl_GetDisplayStart( nTab, pDoc, nPages );
}
else // leeres Dokument
{
nTab = 0;
nPageNo = nTabPage = nTabStart = nDisplayStart = 0;
aState.nPrintTab = 0;
aState.nStartCol = aState.nEndCol = 0;
aState.nStartRow = aState.nEndRow = 0;
aState.nZoom = 0;
aState.nPagesX = aState.nPagesY = 0;
aState.nTabPages = aState.nTotalPages =
aState.nPageStart = aState.nDocPages = 0;
}
}
}
void ScPreview::CalcPages( SCTAB /*nToWhichTab*/ )
{
WaitObject( this );
ScDocument* pDoc = pDocShell->GetDocument();
nTabCount = pDoc->GetTableCount();
//SCTAB nAnz = Min( nTabCount, SCTAB(nToWhichTab+1) );
SCTAB nAnz = nTabCount;
SCTAB nStart = nTabsTested;
if (!bValid)
{
nStart = 0;
nTotalPages = 0;
nTabsTested = 0;
}
// update all pending row heights with a single progress bar,
// instead of a separate progress for each sheet from ScPrintFunc
pDocShell->UpdatePendingRowHeights( nAnz-1, true );
// PrintOptions is passed to PrintFunc for SkipEmpty flag,
// but always all sheets are used (there is no selected sheet)
ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
for (SCTAB i=nStart; i<nAnz; i++)
{
long nAttrPage = i > 0 ? nFirstAttr[i-1] : 1;
long nThisStart = nTotalPages;
ScPrintFunc aPrintFunc( this, pDocShell, i, nAttrPage, 0, NULL, &aOptions );
long nThisTab = aPrintFunc.GetTotalPages();
nPages[i] = nThisTab;
nTotalPages += nThisTab;
nFirstAttr[i] = aPrintFunc.GetFirstPageNo(); // behalten oder aus Vorlage
if (nPageNo>=nThisStart && nPageNo<nTotalPages)
{
nTab = i;
nTabPage = nPageNo - nThisStart;
nTabStart = nThisStart;
aPrintFunc.GetPrintState( aState );
aPageSize = aPrintFunc.GetPageSize();
}
}
nDisplayStart = lcl_GetDisplayStart( nTab, pDoc, nPages );
if (nAnz > nTabsTested)
nTabsTested = nAnz;
// testen, ob hinter letzter Seite
if ( nTabsTested >= nTabCount )
TestLastPage();
aState.nDocPages = nTotalPages;
bValid = sal_True;
bStateValid = sal_True;
DoInvalidate();
}
void ScPreview::RecalcPages() // nur nPageNo geaendert
{
if (!bValid)
return; // dann wird CalcPages aufgerufen
SCTAB nOldTab = nTab;
sal_Bool bDone = sal_False;
while (nPageNo >= nTotalPages && nTabsTested < nTabCount)
{
CalcPages( nTabsTested );
bDone = sal_True;
}
if (!bDone)
{
long nPartPages = 0;
for (SCTAB i=0; i<nTabsTested; i++)
{
long nThisStart = nPartPages;
nPartPages += nPages[i];
if (nPageNo>=nThisStart && nPageNo<nPartPages)
{
nTab = i;
nTabPage = nPageNo - nThisStart;
nTabStart = nThisStart;
// aPageSize = aPrintFunc.GetPageSize();
}
}
ScDocument* pDoc = pDocShell->GetDocument();
nDisplayStart = lcl_GetDisplayStart( nTab, pDoc, nPages );
}
TestLastPage(); // testen, ob hinter letzter Seite
if ( nTab != nOldTab )
bStateValid = sal_False;
DoInvalidate();
}
void ScPreview::DoPrint( ScPreviewLocationData* pFillLocation )
{
if (!bValid)
{
CalcPages(0);
RecalcPages();
UpdateDrawView(); // Tabelle evtl. geaendert
}
Fraction aPreviewZoom( nZoom, 100 );
Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
sal_Bool bDoPrint = ( pFillLocation == NULL );
sal_Bool bValidPage = ( nPageNo < nTotalPages );
ScModule* pScMod = SC_MOD();
const svtools::ColorConfig& rColorCfg = pScMod->GetColorConfig();
Color aBackColor( rColorCfg.GetColorValue(svtools::APPBACKGROUND).nColor );
if ( bDoPrint && ( aOffset.X() < 0 || aOffset.Y() < 0 ) && bValidPage )
{
SetMapMode( aMMMode );
SetLineColor();
SetFillColor(aBackColor);
Size aWinSize = GetOutputSize();
if ( aOffset.X() < 0 )
DrawRect(Rectangle( 0, 0, -aOffset.X(), aWinSize.Height() ));
if ( aOffset.Y() < 0 )
DrawRect(Rectangle( 0, 0, aWinSize.Width(), -aOffset.Y() ));
}
long nLeftMargin = 0;
long nRightMargin = 0;
long nTopMargin = 0;
long nBottomMargin = 0;
sal_Bool bHeaderOn = sal_False;
sal_Bool bFooterOn = sal_False;
ScDocument* pDoc = pDocShell->GetDocument();
sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
Size aLocalPageSize;
if ( bValidPage )
{
ScPrintOptions aOptions = pScMod->GetPrintOptions();
ScPrintFunc* pPrintFunc;
if (bStateValid)
pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
else
pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
pPrintFunc->SetOffset(aOffset);
pPrintFunc->SetManualZoom(nZoom);
pPrintFunc->SetDateTime(aDate,aTime);
pPrintFunc->SetClearFlag(sal_True);
pPrintFunc->SetUseStyleColor( pScMod->GetAccessOptions().GetIsForPagePreviews() );
pPrintFunc->SetDrawView( pDrawView );
// MultiSelection fuer die eine Seite muss etwas umstaendlich erzeugt werden...
Range aPageRange( nPageNo+1, nPageNo+1 );
MultiSelection aPage( aPageRange );
aPage.SetTotalRange( Range(0,RANGE_MAX) );
aPage.Select( aPageRange );
long nPrinted = pPrintFunc->DoPrint( aPage, nTabStart, nDisplayStart, bDoPrint, pFillLocation );
DBG_ASSERT(nPrinted<=1, "was'n nu los?");
SetMapMode(aMMMode);
//init nLeftMargin ... in the ScPrintFunc::InitParam!!!
nLeftMargin = pPrintFunc->GetLeftMargin();
nRightMargin = pPrintFunc->GetRightMargin();
nTopMargin = pPrintFunc->GetTopMargin();
nBottomMargin = pPrintFunc->GetBottomMargin();
nHeaderHeight = pPrintFunc->GetHeader().nHeight;
nFooterHeight = pPrintFunc->GetFooter().nHeight;
bHeaderOn = pPrintFunc->GetHeader().bEnable;
bFooterOn = pPrintFunc->GetFooter().bEnable;
mnScale = pPrintFunc->GetZoom();
if ( bDoPrint && bPageMargin && pLocationData ) // don't make use of pLocationData while filling it
{
Rectangle aPixRect;
Rectangle aRectCellPosition;
Rectangle aRectPosition;
pLocationData->GetMainCellRange( aPageArea, aPixRect );
if( !bLayoutRTL )
{
pLocationData->GetCellPosition( aPageArea.aStart, aRectPosition );
nLeftPosition = aRectPosition.Left();
for( SCCOL i = aPageArea.aStart.Col(); i <= aPageArea.aEnd.Col(); i++ )
{
pLocationData->GetCellPosition( ScAddress( i,aPageArea.aStart.Row(),aPageArea.aStart.Tab()),aRectCellPosition );
nRight[i] = aRectCellPosition.Right();
}
}
else
{
pLocationData->GetCellPosition( aPageArea.aEnd, aRectPosition );
nLeftPosition = aRectPosition.Right()+1;
pLocationData->GetCellPosition( aPageArea.aStart,aRectCellPosition );
nRight[ aPageArea.aEnd.Col() ] = aRectCellPosition.Left();
for( SCCOL i = aPageArea.aEnd.Col(); i > aPageArea.aStart.Col(); i-- )
{
pLocationData->GetCellPosition( ScAddress( i,aPageArea.aEnd.Row(),aPageArea.aEnd.Tab()),aRectCellPosition );
nRight[ i-1 ] = nRight[ i ] + aRectCellPosition.Right() - aRectCellPosition.Left() + 1;
}
}
}
if (nPrinted) // wenn nichts, alles grau zeichnen
{
aLocalPageSize = pPrintFunc->GetPageSize();
aLocalPageSize.Width() = (long) (aLocalPageSize.Width() * HMM_PER_TWIPS );
aLocalPageSize.Height() = (long) (aLocalPageSize.Height() * HMM_PER_TWIPS );
nLeftMargin = (long) ( nLeftMargin * HMM_PER_TWIPS );
nRightMargin = (long) ( nRightMargin * HMM_PER_TWIPS );
nTopMargin = (long) ( nTopMargin * HMM_PER_TWIPS );
nBottomMargin = (long) ( nBottomMargin * HMM_PER_TWIPS );
nHeaderHeight = (long) ( nHeaderHeight * HMM_PER_TWIPS * mnScale / 100 + nTopMargin );
nFooterHeight = (long) ( nFooterHeight * HMM_PER_TWIPS * mnScale / 100 + nBottomMargin );
}
if (!bStateValid)
{
pPrintFunc->GetPrintState( aState );
aState.nDocPages = nTotalPages;
bStateValid = sal_True;
}
delete pPrintFunc;
}
if ( bDoPrint )
{
long nPageEndX = aLocalPageSize.Width() - aOffset.X();
long nPageEndY = aLocalPageSize.Height() - aOffset.Y();
if ( !bValidPage )
nPageEndX = nPageEndY = 0;
Size aWinSize = GetOutputSize();
Point aWinEnd( aWinSize.Width(), aWinSize.Height() );
sal_Bool bRight = nPageEndX <= aWinEnd.X();
sal_Bool bBottom = nPageEndY <= aWinEnd.Y();
if( bPageMargin && bValidPage )
{
SetMapMode(aMMMode);
SetLineColor( COL_BLACK );
DrawInvert( (long)( nTopMargin - aOffset.Y() ), POINTER_VSIZEBAR );
DrawInvert( (long)(nPageEndY - nBottomMargin ), POINTER_VSIZEBAR );
DrawInvert( (long)( nLeftMargin - aOffset.X() ), POINTER_HSIZEBAR );
DrawInvert( (long)( nPageEndX - nRightMargin ) , POINTER_HSIZEBAR );
if( bHeaderOn )
{
DrawInvert( nHeaderHeight - aOffset.Y(), POINTER_VSIZEBAR );
}
if( bFooterOn )
{
DrawInvert( nPageEndY - nFooterHeight, POINTER_VSIZEBAR );
}
SetMapMode( MapMode( MAP_PIXEL ) );
for( int i= aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
{
Point aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
SetLineColor( COL_BLACK );
SetFillColor( COL_BLACK );
DrawRect( Rectangle( Point( nRight[i] - 2, aColumnTop.Y() ),Point( nRight[i] + 2 , 4 + aColumnTop.Y()) ));
DrawLine( Point( nRight[i], aColumnTop.Y() ), Point( nRight[i], 10 + aColumnTop.Y()) );
}
SetMapMode( aMMMode );
}
if (bRight || bBottom)
{
SetMapMode(aMMMode);
SetLineColor();
SetFillColor(aBackColor);
if (bRight)
DrawRect(Rectangle(nPageEndX,0, aWinEnd.X(),aWinEnd.Y()));
if (bBottom)
{
if (bRight)
DrawRect(Rectangle(0,nPageEndY, nPageEndX,aWinEnd.Y())); // Ecke nicht doppelt
else
DrawRect(Rectangle(0,nPageEndY, aWinEnd.X(),aWinEnd.Y()));
}
}
if ( bValidPage )
{
Color aBorderColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
// draw border
if ( aOffset.X() <= 0 || aOffset.Y() <= 0 || bRight || bBottom )
{
SetLineColor( aBorderColor );
SetFillColor();
Rectangle aPixel( LogicToPixel( Rectangle( -aOffset.X(), -aOffset.Y(), nPageEndX, nPageEndY ) ) );
--aPixel.Right();
--aPixel.Bottom();
DrawRect( PixelToLogic( aPixel ) );
}
// draw shadow
SetLineColor();
SetFillColor( aBorderColor );
Rectangle aPixel;
aPixel = LogicToPixel( Rectangle( nPageEndX, -aOffset.Y(), nPageEndX, nPageEndY ) );
aPixel.Top() += SC_PREVIEW_SHADOWSIZE;
aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
DrawRect( PixelToLogic( aPixel ) );
aPixel = LogicToPixel( Rectangle( -aOffset.X(), nPageEndY, nPageEndX, nPageEndY ) );
aPixel.Left() += SC_PREVIEW_SHADOWSIZE;
aPixel.Right() += SC_PREVIEW_SHADOWSIZE - 1;
aPixel.Bottom() += SC_PREVIEW_SHADOWSIZE - 1;
DrawRect( PixelToLogic( aPixel ) );
}
}
}
//Issue51656 Add resizeable margin on page preview from maoyg
void __EXPORT ScPreview::Paint( const Rectangle& /* rRect */ )
{
bool bWasInPaint = bInPaint; // nested calls shouldn't be necessary, but allow for now
bInPaint = true;
if (bPageMargin)
GetLocationData(); // fill location data for column positions
DoPrint( NULL );
pViewShell->UpdateScrollBars();
bInPaint = bWasInPaint;
}
//Issue51656 Add resizeable margin on page preview from maoyg
void __EXPORT ScPreview::Command( const CommandEvent& rCEvt )
{
sal_uInt16 nCmd = rCEvt.GetCommand();
if ( nCmd == COMMAND_WHEEL || nCmd == COMMAND_STARTAUTOSCROLL || nCmd == COMMAND_AUTOSCROLL )
{
sal_Bool bDone = pViewShell->ScrollCommand( rCEvt );
if (!bDone)
Window::Command(rCEvt);
}
else if ( nCmd == COMMAND_CONTEXTMENU )
SfxDispatcher::ExecutePopup();
else
Window::Command( rCEvt );
}
void __EXPORT ScPreview::KeyInput( const KeyEvent& rKEvt )
{
// The + and - keys can't be configured as accelerator entries, so they must be handled directly
// (in ScPreview, not ScPreviewShell -> only if the preview window has the focus)
const KeyCode& rKeyCode = rKEvt.GetKeyCode();
sal_uInt16 nKey = rKeyCode.GetCode();
sal_Bool bHandled = sal_False;
if(!rKeyCode.GetModifier())
{
sal_uInt16 nSlot = 0;
switch(nKey)
{
case KEY_ADD: nSlot = SID_PREVIEW_ZOOMIN; break;
case KEY_ESCAPE: nSlot = ScViewUtil::IsFullScreen( *pViewShell ) ? SID_CANCEL : SID_PREVIEW_CLOSE; break;
case KEY_SUBTRACT: nSlot = SID_PREVIEW_ZOOMOUT; break;
}
if(nSlot)
{
bHandled = sal_True;
pViewShell->GetViewFrame()->GetDispatcher()->Execute( nSlot, SFX_CALLMODE_ASYNCHRON );
}
}
if ( !bHandled && !pViewShell->KeyInput(rKEvt) )
Window::KeyInput(rKEvt);
}
const ScPreviewLocationData& ScPreview::GetLocationData()
{
if ( !pLocationData )
{
pLocationData = new ScPreviewLocationData( pDocShell->GetDocument(), this );
bLocationValid = sal_False;
}
if ( !bLocationValid )
{
pLocationData->Clear();
DoPrint( pLocationData );
bLocationValid = sal_True;
}
return *pLocationData;
}
void ScPreview::DataChanged(sal_Bool bNewTime)
{
if (bNewTime)
{
aDate = Date();
aTime = Time();
}
bValid = sal_False;
InvalidateLocationData( SC_HINT_DATACHANGED );
Invalidate();
}
String ScPreview::GetPosString()
{
if (!bValid)
{
CalcPages(nTab);
UpdateDrawView(); // Tabelle evtl. geaendert
}
String aString( ScGlobal::GetRscString( STR_PAGE ) );
aString += ' ';
aString += String::CreateFromInt32(nPageNo+1);
if (nTabsTested >= nTabCount)
{
aString.AppendAscii(RTL_CONSTASCII_STRINGPARAM( " / " ));
aString += String::CreateFromInt32(nTotalPages);
}
return aString;
}
void ScPreview::SetZoom(sal_uInt16 nNewZoom)
{
if (nNewZoom < 20)
nNewZoom = 20;
if (nNewZoom > 400)
nNewZoom = 400;
if (nNewZoom != nZoom)
{
nZoom = nNewZoom;
// apply new MapMode and call UpdateScrollBars to update aOffset
Fraction aPreviewZoom( nZoom, 100 );
Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
SetMapMode( aMMMode );
bInSetZoom = true; // don't scroll during SetYOffset in UpdateScrollBars
pViewShell->UpdateScrollBars();
bInSetZoom = false;
bStateValid = sal_False;
InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
DoInvalidate();
Invalidate();
}
}
void ScPreview::SetPageNo( long nPage )
{
nPageNo = nPage;
RecalcPages();
UpdateDrawView(); // Tabelle evtl. geaendert
InvalidateLocationData( SC_HINT_DATACHANGED );
Invalidate();
}
long ScPreview::GetFirstPage(SCTAB nTabP)
{
SCTAB nDocTabCount = pDocShell->GetDocument()->GetTableCount();
if (nTabP >= nDocTabCount)
nTabP = nDocTabCount-1;
long nPage = 0;
if (nTabP>0)
{
CalcPages( nTabP );
UpdateDrawView(); // Tabelle evtl. geaendert
for (SCTAB i=0; i<nTabP; i++)
nPage += nPages[i];
// bei leerer Tabelle vorhergehende Seite
if ( nPages[nTabP]==0 && nPage > 0 )
--nPage;
}
return nPage;
}
Size lcl_GetDocPageSize( ScDocument* pDoc, SCTAB nTab )
{
String aName = pDoc->GetPageStyle( nTab );
ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aName, SFX_STYLE_FAMILY_PAGE );
if ( pStyleSheet )
{
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
return ((const SvxSizeItem&) rStyleSet.Get(ATTR_PAGE_SIZE)).GetSize();
}
else
{
DBG_ERROR( "PageStyle not found" );
return Size();
}
}
sal_uInt16 ScPreview::GetOptimalZoom(sal_Bool bWidthOnly)
{
double nWinScaleX = ScGlobal::nScreenPPTX / pDocShell->GetOutputFactor();
double nWinScaleY = ScGlobal::nScreenPPTY;
Size aWinSize = GetOutputSizePixel();
// desired margin is 0.25cm in default MapMode (like Writer),
// but some additional margin is introduced by integer scale values
// -> add only 0.10cm, so there is some margin in all cases.
Size aMarginSize( LogicToPixel( Size( 100, 100 ), MAP_100TH_MM ) );
aWinSize.Width() -= 2 * aMarginSize.Width();
aWinSize.Height() -= 2 * aMarginSize.Height();
Size aLocalPageSize = lcl_GetDocPageSize( pDocShell->GetDocument(), nTab );
if ( aLocalPageSize.Width() && aLocalPageSize.Height() )
{
long nZoomX = (long) ( aWinSize.Width() * 100 / ( aLocalPageSize.Width() * nWinScaleX ));
long nZoomY = (long) ( aWinSize.Height() * 100 / ( aLocalPageSize.Height() * nWinScaleY ));
long nOptimal = nZoomX;
if (!bWidthOnly && nZoomY<nOptimal)
nOptimal = nZoomY;
if (nOptimal<20)
nOptimal = 20;
if (nOptimal>400)
nOptimal = 400;
return (sal_uInt16) nOptimal;
}
else
return nZoom;
}
void ScPreview::SetXOffset( long nX )
{
if ( aOffset.X() == nX )
return;
if (bValid)
{
long nDif = LogicToPixel(aOffset).X() - LogicToPixel(Point(nX,0)).X();
aOffset.X() = nX;
if (nDif && !bInSetZoom)
{
MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
Scroll( nDif, 0 );
SetMapMode(aOldMode);
}
}
else
{
aOffset.X() = nX;
if (!bInSetZoom)
Invalidate();
}
InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
Paint(Rectangle());
}
void ScPreview::SetYOffset( long nY )
{
if ( aOffset.Y() == nY )
return;
if (bValid)
{
long nDif = LogicToPixel(aOffset).Y() - LogicToPixel(Point(0,nY)).Y();
aOffset.Y() = nY;
if (nDif && !bInSetZoom)
{
MapMode aOldMode = GetMapMode(); SetMapMode(MAP_PIXEL);
Scroll( 0, nDif );
SetMapMode(aOldMode);
}
}
else
{
aOffset.Y() = nY;
if (!bInSetZoom)
Invalidate();
}
InvalidateLocationData( SC_HINT_ACC_VISAREACHANGED );
Paint(Rectangle());
}
void ScPreview::DoInvalidate()
{
// Wenn das ganze aus dem GetState der Shell gerufen wird,
// muss das Invalidate hinterher asynchron kommen...
if (bInGetState)
Application::PostUserEvent( STATIC_LINK( this, ScPreview, InvalidateHdl ) );
else
StaticInvalidate(); // sofort
}
void ScPreview::StaticInvalidate()
{
// static method, because it's called asynchronously
// -> must use current viewframe
SfxViewFrame* pViewFrm = SfxViewFrame::Current();
if (!pViewFrm)
return;
SfxBindings& rBindings = pViewFrm->GetBindings();
rBindings.Invalidate(SID_STATUS_DOCPOS);
rBindings.Invalidate(SID_STATUS_PAGESTYLE);
rBindings.Invalidate(SID_PREVIEW_PREVIOUS);
rBindings.Invalidate(SID_PREVIEW_NEXT);
rBindings.Invalidate(SID_PREVIEW_FIRST);
rBindings.Invalidate(SID_PREVIEW_LAST);
rBindings.Invalidate(SID_ATTR_ZOOM);
rBindings.Invalidate(SID_PREVIEW_ZOOMIN);
rBindings.Invalidate(SID_PREVIEW_ZOOMOUT);
rBindings.Invalidate(SID_PREVIEW_SCALINGFACTOR);
rBindings.Invalidate(SID_ATTR_ZOOMSLIDER);
}
IMPL_STATIC_LINK( ScPreview, InvalidateHdl, void*, EMPTYARG )
{
(void)pThis; // avoid warning
StaticInvalidate();
return 0;
}
void ScPreview::DataChanged( const DataChangedEvent& rDCEvt )
{
Window::DataChanged(rDCEvt);
if ( (rDCEvt.GetType() == DATACHANGED_PRINTER) ||
(rDCEvt.GetType() == DATACHANGED_DISPLAY) ||
(rDCEvt.GetType() == DATACHANGED_FONTS) ||
(rDCEvt.GetType() == DATACHANGED_FONTSUBSTITUTION) ||
((rDCEvt.GetType() == DATACHANGED_SETTINGS) &&
(rDCEvt.GetFlags() & SETTINGS_STYLE)) )
{
if ( rDCEvt.GetType() == DATACHANGED_FONTS )
pDocShell->UpdateFontList();
// #i114518# Paint of form controls may modify the window's settings.
// Ignore the event if it is called from within Paint.
if ( !bInPaint )
{
if ( rDCEvt.GetType() == DATACHANGED_SETTINGS &&
(rDCEvt.GetFlags() & SETTINGS_STYLE) )
{
// scroll bar size may have changed
pViewShell->InvalidateBorder(); // calls OuterResizePixel
}
Invalidate();
InvalidateLocationData( SC_HINT_DATACHANGED );
}
}
}
//Issue51656 Add resizeable margin on page preview from maoyg
void __EXPORT ScPreview::MouseButtonDown( const MouseEvent& rMEvt )
{
Fraction aPreviewZoom( nZoom, 100 );
Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
aButtonDownChangePoint = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
aButtonDownPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
CaptureMouse();
if( rMEvt.IsLeft() && GetPointer() == POINTER_HSIZEBAR )
{
SetMapMode( aMMMode );
if( bLeftRulerChange )
{
DrawInvert( aButtonDownChangePoint.X(), POINTER_HSIZEBAR );
bLeftRulerMove = sal_True;
bRightRulerMove = sal_False;
}
else if( bRightRulerChange )
{
DrawInvert( aButtonDownChangePoint.X(), POINTER_HSIZEBAR );
bLeftRulerMove = sal_False;
bRightRulerMove = sal_True;
}
}
if( rMEvt.IsLeft() && GetPointer() == POINTER_VSIZEBAR )
{
SetMapMode( aMMMode );
if( bTopRulerChange )
{
DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
bTopRulerMove = sal_True;
bBottomRulerMove = sal_False;
}
else if( bBottomRulerChange )
{
DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
bTopRulerMove = sal_False;
bBottomRulerMove = sal_True;
}
else if( bHeaderRulerChange )
{
DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
bHeaderRulerMove = sal_True;
bFooterRulerMove = sal_False;
}
else if( bFooterRulerChange )
{
DrawInvert( aButtonDownChangePoint.Y(), POINTER_VSIZEBAR );
bHeaderRulerMove = sal_False;
bFooterRulerMove = sal_True;
}
}
if( rMEvt.IsLeft() && GetPointer() == POINTER_HSPLIT )
{
Point aNowPt = rMEvt.GetPosPixel();
SCCOL i = 0;
for( i = aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
{
if( aNowPt.X() < nRight[i] + 2 && aNowPt.X() > nRight[i] - 2 )
{
nColNumberButttonDown = i;
break;
}
}
if( i == aPageArea.aEnd.Col()+1 )
return;
SetMapMode( aMMMode );
if( nColNumberButttonDown == aPageArea.aStart.Col() )
DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,POINTER_HSPLIT );
else
DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,POINTER_HSPLIT );
DrawInvert( aButtonDownChangePoint.X(), POINTER_HSPLIT );
bColRulerMove = sal_True;
}
}
void __EXPORT ScPreview::MouseButtonUp( const MouseEvent& rMEvt )
{
Fraction aPreviewZoom( nZoom, 100 );
Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
aButtonUpPt = PixelToLogic( rMEvt.GetPosPixel(),aMMMode );
long nWidth = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Width();
long nHeight = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Height();
if( rMEvt.IsLeft() && GetPointer() == POINTER_HSIZEBAR )
{
SetPointer( Pointer( POINTER_ARROW ) );
sal_Bool bMoveRulerAction= sal_True;
ScDocument * pDoc = pDocShell->GetDocument();
String aOldName = pDoc->GetPageStyle( nTab );
sal_Bool bUndo( pDoc->IsUndoEnabled() );
ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( aOldName, SFX_STYLE_FAMILY_PAGE );
if ( pStyleSheet )
{
ScStyleSaveData aOldData;
if( bUndo )
aOldData.InitFromStyle( pStyleSheet );
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
SvxLRSpaceItem aLRItem = ( const SvxLRSpaceItem& ) rStyleSet.Get( ATTR_LRSPACE );
if(( bLeftRulerChange || bRightRulerChange ) && ( aButtonUpPt.X() <= ( 0 - aOffset.X() ) || aButtonUpPt.X() > nWidth * HMM_PER_TWIPS - aOffset.X() ) )
{
bMoveRulerAction = sal_False;
Paint(Rectangle(0,0,10000,10000));
}
else if( bLeftRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS > nWidth - aLRItem.GetRight() - aOffset.X() / HMM_PER_TWIPS ) )
{
bMoveRulerAction = sal_False;
Paint(Rectangle(0,0,10000,10000));
}
else if( bRightRulerChange && ( aButtonUpPt.X() / HMM_PER_TWIPS < aLRItem.GetLeft() - aOffset.X() / HMM_PER_TWIPS ) )
{
bMoveRulerAction = sal_False;
Paint(Rectangle(0,0,10000,10000));
}
else if( aButtonDownPt.X() == aButtonUpPt.X() )
{
bMoveRulerAction = sal_False;
DrawInvert( aButtonUpPt.X(), POINTER_HSIZEBAR );
}
if( bMoveRulerAction )
{
ScDocShellModificator aModificator( *pDocShell );
if( bLeftRulerChange && bLeftRulerMove )
{
aLRItem.SetLeft( (long)( aButtonUpPt.X() / HMM_PER_TWIPS + aOffset.X() / HMM_PER_TWIPS ));
rStyleSet.Put( aLRItem );
}
else if( bRightRulerChange && bRightRulerMove )
{
aLRItem.SetRight( (long)( nWidth - aButtonUpPt.X() / HMM_PER_TWIPS - aOffset.X() / HMM_PER_TWIPS ));
rStyleSet.Put( aLRItem );
}
ScStyleSaveData aNewData;
aNewData.InitFromStyle( pStyleSheet );
if( bUndo )
{
pDocShell->GetUndoManager()->AddUndoAction(
new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
aOldData, aNewData ) );
}
if ( ValidTab( nTab ) )
{
ScPrintFunc aPrintFunc( this, pDocShell, nTab );
aPrintFunc.UpdatePages();
}
Rectangle aRect(0,0,10000,10000);
Paint( aRect );
aModificator.SetDocumentModified();
bLeftRulerChange = sal_False;
bRightRulerChange = sal_False;
}
}
bLeftRulerMove = sal_False;
bRightRulerMove = sal_False;
}
if( rMEvt.IsLeft() && GetPointer() == POINTER_VSIZEBAR )
{
SetPointer( POINTER_ARROW );
sal_Bool bMoveRulerAction = sal_True;
if( ( bTopRulerChange || bBottomRulerChange || bHeaderRulerChange || bFooterRulerChange ) && ( aButtonUpPt.Y() <= ( 0 - aOffset.Y() ) || aButtonUpPt.Y() > nHeight * HMM_PER_TWIPS -aOffset.Y() ) )
{
bMoveRulerAction = sal_False;
Paint( Rectangle(0,0,10000,10000) );
}
else if( aButtonDownPt.Y() == aButtonUpPt.Y() )
{
bMoveRulerAction = sal_False;
DrawInvert( aButtonUpPt.Y(), POINTER_VSIZEBAR );
}
if( bMoveRulerAction )
{
ScDocument * pDoc = pDocShell->GetDocument();
sal_Bool bUndo( pDoc->IsUndoEnabled() );
ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
SfxStyleSheetBase* pStyleSheet = pStylePool->Find( pDoc->GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE );
DBG_ASSERT( pStyleSheet, "PageStyle not found" );
if ( pStyleSheet )
{
ScDocShellModificator aModificator( *pDocShell );
ScStyleSaveData aOldData;
if( bUndo )
aOldData.InitFromStyle( pStyleSheet );
SfxItemSet& rStyleSet = pStyleSheet->GetItemSet();
SvxULSpaceItem aULItem = ( const SvxULSpaceItem&)rStyleSet.Get( ATTR_ULSPACE );
if( bTopRulerMove && bTopRulerChange )
{
aULItem.SetUpperValue( (sal_uInt16)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS ) );
rStyleSet.Put( aULItem );
}
else if( bBottomRulerMove && bBottomRulerChange )
{
aULItem.SetLowerValue( (sal_uInt16)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS ) );
rStyleSet.Put( aULItem );
}
else if( bHeaderRulerMove && bHeaderRulerChange )
{
const SfxPoolItem* pItem = NULL;
if ( rStyleSet.GetItemState( ATTR_PAGE_HEADERSET, sal_False, &pItem ) == SFX_ITEM_SET )
{
SfxItemSet& pHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
Size aHeaderSize = ((const SvxSizeItem&)pHeaderSet.Get(ATTR_PAGE_SIZE)).GetSize();
aHeaderSize.Height() = (long)( aButtonUpPt.Y() / HMM_PER_TWIPS + aOffset.Y() / HMM_PER_TWIPS - aULItem.GetUpper());
aHeaderSize.Height() = aHeaderSize.Height() * 100 / mnScale;
SvxSetItem aNewHeader( (const SvxSetItem&)rStyleSet.Get(ATTR_PAGE_HEADERSET) );
aNewHeader.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aHeaderSize ) );
rStyleSet.Put( aNewHeader );
}
}
else if( bFooterRulerMove && bFooterRulerChange )
{
const SfxPoolItem* pItem = NULL;
if( rStyleSet.GetItemState( ATTR_PAGE_FOOTERSET, sal_False, &pItem ) == SFX_ITEM_SET )
{
SfxItemSet& pFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
Size aFooterSize = ((const SvxSizeItem&)pFooterSet.Get(ATTR_PAGE_SIZE)).GetSize();
aFooterSize.Height() = (long)( nHeight - aButtonUpPt.Y() / HMM_PER_TWIPS - aOffset.Y() / HMM_PER_TWIPS - aULItem.GetLower() );
aFooterSize.Height() = aFooterSize.Height() * 100 / mnScale;
SvxSetItem aNewFooter( (const SvxSetItem&)rStyleSet.Get(ATTR_PAGE_FOOTERSET) );
aNewFooter.GetItemSet().Put( SvxSizeItem( ATTR_PAGE_SIZE, aFooterSize ) );
rStyleSet.Put( aNewFooter );
}
}
ScStyleSaveData aNewData;
aNewData.InitFromStyle( pStyleSheet );
if( bUndo )
{
pDocShell->GetUndoManager()->AddUndoAction(
new ScUndoModifyStyle( pDocShell, SFX_STYLE_FAMILY_PAGE,
aOldData, aNewData ) );
}
if ( ValidTab( nTab ) )
{
ScPrintFunc aPrintFunc( this, pDocShell, nTab );
aPrintFunc.UpdatePages();
}
Rectangle aRect(0,0,10000,10000);
Paint( aRect );
aModificator.SetDocumentModified();
bTopRulerChange = sal_False;
bBottomRulerChange = sal_False;
bHeaderRulerChange = sal_False;
bFooterRulerChange = sal_False;
}
}
bTopRulerMove = sal_False;
bBottomRulerMove = sal_False;
bHeaderRulerMove = sal_False;
bFooterRulerMove = sal_False;
}
if( rMEvt.IsLeft() && GetPointer() == POINTER_HSPLIT )
{
SetPointer(POINTER_ARROW);
ScDocument* pDoc = pDocShell->GetDocument();
sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
sal_Bool bMoveRulerAction = sal_True;
if( aButtonDownPt.X() == aButtonUpPt.X() )
{
bMoveRulerAction = sal_False;
if( nColNumberButttonDown == aPageArea.aStart.Col() )
DrawInvert( PixelToLogic( Point( nLeftPosition, 0 ),aMMMode ).X() ,POINTER_HSPLIT );
else
DrawInvert( PixelToLogic( Point( nRight[ nColNumberButttonDown-1 ], 0 ),aMMMode ).X() ,POINTER_HSPLIT );
DrawInvert( aButtonUpPt.X(), POINTER_HSPLIT );
}
if( bMoveRulerAction )
{
long nNewColWidth = 0;
ScDocFunc aFunc(*pDocShell);
SCCOLROW nCols[2] = { nColNumberButttonDown, nColNumberButttonDown };
if( !bLayoutRTL )
{
nNewColWidth = (long) ( PixelToLogic( Point( rMEvt.GetPosPixel().X() - nRight[ nColNumberButttonDown ], 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
nNewColWidth += pDocShell->GetDocument()->GetColWidth( nColNumberButttonDown, nTab );
}
else
{
nNewColWidth = (long) ( PixelToLogic( Point( nRight[ nColNumberButttonDown ] - rMEvt.GetPosPixel().X(), 0), aMMMode ).X() / HMM_PER_TWIPS ) * 100 / mnScale;
nNewColWidth += pDocShell->GetDocument()->GetColWidth( nColNumberButttonDown, nTab );
}
if( nNewColWidth >= 0 )
{
aFunc.SetWidthOrHeight( sal_True, 1,nCols, nTab, SC_SIZE_DIRECT, (sal_uInt16)nNewColWidth, sal_True, sal_True);
}
if ( ValidTab( nTab ) )
{
ScPrintFunc aPrintFunc( this, pDocShell, nTab );
aPrintFunc.UpdatePages();
}
Rectangle nRect(0,0,10000,10000);
Paint( nRect );
}
bColRulerMove = sal_False;
}
ReleaseMouse();
}
void __EXPORT ScPreview::MouseMove( const MouseEvent& rMEvt )
{
Fraction aPreviewZoom( nZoom, 100 );
Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
Point aMouseMovePoint = PixelToLogic( rMEvt.GetPosPixel(), aMMMode );
long nLeftMargin = 0;
long nRightMargin = 0;
long nTopMargin = 0;
long nBottomMargin = 0;
Size PageSize;
long nWidth = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Width();
long nHeight = (long) lcl_GetDocPageSize(pDocShell->GetDocument(), nTab).Height();
if ( nPageNo < nTotalPages )
{
ScPrintOptions aOptions = SC_MOD()->GetPrintOptions();
ScPrintFunc* pPrintFunc;
if (bStateValid)
pPrintFunc = new ScPrintFunc( this, pDocShell, aState, &aOptions );
else
pPrintFunc = new ScPrintFunc( this, pDocShell, nTab, nFirstAttr[nTab], nTotalPages, NULL, &aOptions );
nLeftMargin = (long)( pPrintFunc->GetLeftMargin() * HMM_PER_TWIPS - aOffset.X() );
nRightMargin = (long)( pPrintFunc->GetRightMargin() * HMM_PER_TWIPS );
nRightMargin = (long)( nWidth * HMM_PER_TWIPS - nRightMargin - aOffset.X() );
nTopMargin = (long)( pPrintFunc->GetTopMargin() * HMM_PER_TWIPS - aOffset.Y() );
nBottomMargin = (long)( pPrintFunc->GetBottomMargin() * HMM_PER_TWIPS );
nBottomMargin = (long)( nHeight * HMM_PER_TWIPS - nBottomMargin - aOffset.Y() );
if( mnScale > 0 )
{
nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS * mnScale / 100 );
nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS * mnScale / 100 );
}
else
{
nHeaderHeight = (long)( nTopMargin + pPrintFunc->GetHeader().nHeight * HMM_PER_TWIPS );
nFooterHeight = (long)( nBottomMargin - pPrintFunc->GetFooter().nHeight * HMM_PER_TWIPS );
}
delete pPrintFunc;
}
Point aPixPt( rMEvt.GetPosPixel() );
Point aLeftTop = LogicToPixel( Point( nLeftMargin, -aOffset.Y() ) , aMMMode );
Point aLeftBottom = LogicToPixel( Point( nLeftMargin ,(long)(nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
Point aRightTop = LogicToPixel( Point( nRightMargin, -aOffset.Y() ), aMMMode );
Point aTopLeft = LogicToPixel( Point( -aOffset.X(), nTopMargin ), aMMMode );
Point aTopRight = LogicToPixel( Point( (long)(nWidth * HMM_PER_TWIPS - aOffset.X()), nTopMargin ), aMMMode );
Point aBottomLeft = LogicToPixel( Point( -aOffset.X(), nBottomMargin ), aMMMode );
Point aHeaderLeft = LogicToPixel( Point( -aOffset.X(), nHeaderHeight ), aMMMode );
Point aFooderLeft = LogicToPixel( Point( -aOffset.X(), nFooterHeight ), aMMMode );
sal_Bool bOnColRulerChange = sal_False;
for( SCCOL i=aPageArea.aStart.Col(); i<= aPageArea.aEnd.Col(); i++ )
{
Point aColumnTop = LogicToPixel( Point( 0, -aOffset.Y() ) ,aMMMode );
Point aColumnBottom = LogicToPixel( Point( 0, (long)( nHeight * HMM_PER_TWIPS - aOffset.Y()) ), aMMMode );
if( aPixPt.X() < ( nRight[i] + 2 ) && ( aPixPt.X() > ( nRight[i] - 2 ) ) && ( aPixPt.X() < aRightTop.X() ) && ( aPixPt.X() > aLeftTop.X() )
&& ( aPixPt.Y() > aColumnTop.Y() ) && ( aPixPt.Y() < aColumnBottom.Y() ) && !bLeftRulerMove && !bRightRulerMove
&& !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
{
bOnColRulerChange = sal_True;
if( !rMEvt.GetButtons() && GetPointer() == POINTER_HSPLIT )
nColNumberButttonDown = i;
break;
}
}
if( aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 ) && !bRightRulerMove )
{
bLeftRulerChange = sal_True;
bRightRulerChange = sal_False;
}
else if( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) && !bLeftRulerMove )
{
bLeftRulerChange = sal_False;
bRightRulerChange = sal_True;
}
else if( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
{
bTopRulerChange = sal_True;
bBottomRulerChange = sal_False;
bHeaderRulerChange = sal_False;
bFooterRulerChange = sal_False;
}
else if( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) && !bTopRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
{
bTopRulerChange = sal_False;
bBottomRulerChange = sal_True;
bHeaderRulerChange = sal_False;
bFooterRulerChange = sal_False;
}
else if( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bFooterRulerMove )
{
bTopRulerChange = sal_False;
bBottomRulerChange = sal_False;
bHeaderRulerChange = sal_True;
bFooterRulerChange = sal_False;
}
else if( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove )
{
bTopRulerChange = sal_False;
bBottomRulerChange = sal_False;
bHeaderRulerChange = sal_False;
bFooterRulerChange = sal_True;
}
if( bPageMargin )
{
if(( (aPixPt.X() < ( aLeftTop.X() + 2 ) && aPixPt.X() > ( aLeftTop.X() - 2 )) || bLeftRulerMove ||
( aPixPt.X() < ( aRightTop.X() + 2 ) && aPixPt.X() > ( aRightTop.X() - 2 ) ) || bRightRulerMove || bOnColRulerChange || bColRulerMove )
&& aPixPt.Y() > aLeftTop.Y() && aPixPt.Y() < aLeftBottom.Y() )
{
if( bOnColRulerChange || bColRulerMove )
{
SetPointer( Pointer( POINTER_HSPLIT ) );
if( bColRulerMove )
{
if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
DragMove( aMouseMovePoint.X(), POINTER_HSPLIT );
}
}
else
{
if( bLeftRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
{
SetPointer( Pointer( POINTER_HSIZEBAR ) );
if( bLeftRulerMove )
{
if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
DragMove( aMouseMovePoint.X(), POINTER_HSIZEBAR );
}
}
else if( bRightRulerChange && !bTopRulerMove && !bBottomRulerMove && !bHeaderRulerMove && !bFooterRulerMove )
{
SetPointer( Pointer( POINTER_HSIZEBAR ) );
if( bRightRulerMove )
{
if( aMouseMovePoint.X() > -aOffset.X() && aMouseMovePoint.X() < nWidth * HMM_PER_TWIPS - aOffset.X() )
DragMove( aMouseMovePoint.X(), POINTER_HSIZEBAR );
}
}
}
}
else
{
if( ( ( aPixPt.Y() < ( aTopLeft.Y() + 2 ) && aPixPt.Y() > ( aTopLeft.Y() - 2 ) ) || bTopRulerMove ||
( aPixPt.Y() < ( aBottomLeft.Y() + 2 ) && aPixPt.Y() > ( aBottomLeft.Y() - 2 ) ) || bBottomRulerMove ||
( aPixPt.Y() < ( aHeaderLeft.Y() + 2 ) && aPixPt.Y() > ( aHeaderLeft.Y() - 2 ) ) || bHeaderRulerMove ||
( aPixPt.Y() < ( aFooderLeft.Y() + 2 ) && aPixPt.Y() > ( aFooderLeft.Y() - 2 ) ) || bFooterRulerMove )
&& aPixPt.X() > aTopLeft.X() && aPixPt.X() < aTopRight.X() )
{
if( bTopRulerChange )
{
SetPointer( Pointer( POINTER_VSIZEBAR ) );
if( bTopRulerMove )
{
if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
}
}
else if( bBottomRulerChange )
{
SetPointer( Pointer( POINTER_VSIZEBAR ) );
if( bBottomRulerMove )
{
if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
}
}
else if( bHeaderRulerChange )
{
SetPointer( Pointer( POINTER_VSIZEBAR ) );
if( bHeaderRulerMove )
{
if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
}
}
else if( bFooterRulerChange )
{
SetPointer( Pointer( POINTER_VSIZEBAR ) );
if( bFooterRulerMove )
{
if( aMouseMovePoint.Y() > -aOffset.Y() && aMouseMovePoint.Y() < nHeight * HMM_PER_TWIPS - aOffset.Y() )
DragMove( aMouseMovePoint.Y(), POINTER_VSIZEBAR );
}
}
}
else
SetPointer( Pointer( POINTER_ARROW ) );
}
}
}
//Issue51656 Add resizeable margin on page preview from maoyg
void ScPreview::InvalidateLocationData(sal_uLong nId)
{
bLocationValid = sal_False;
if (pViewShell->HasAccessibilityObjects())
pViewShell->BroadcastAccessibility( SfxSimpleHint( nId ) );
}
void ScPreview::GetFocus()
{
if (pViewShell->HasAccessibilityObjects())
pViewShell->BroadcastAccessibility( ScAccWinFocusGotHint(GetAccessible()) );
}
void ScPreview::LoseFocus()
{
if (pViewShell->HasAccessibilityObjects())
pViewShell->BroadcastAccessibility( ScAccWinFocusLostHint(GetAccessible()) );
}
com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> ScPreview::CreateAccessible()
{
com::sun::star::uno::Reference<com::sun::star::accessibility::XAccessible> xAcc= GetAccessible(sal_False);
if (xAcc.is())
{
return xAcc;
}
ScAccessibleDocumentPagePreview* pAccessible =
new ScAccessibleDocumentPagePreview( GetAccessibleParentWindow()->GetAccessible(), pViewShell );
xAcc = pAccessible;
SetAccessible(xAcc);
pAccessible->Init();
return xAcc;
}
// MT: Removed Windows::SwitchView() introduced with IA2 CWS.
// There are other notifications for this when the active view has chnaged, so please update the code to use that event mechanism
void ScPreview::SwitchView()
{
if (!Application::IsAccessibilityEnabled())
{
return ;
}
ScAccessibleDocumentBase* pAccDoc = static_cast<ScAccessibleDocumentBase*>(GetAccessible(sal_False).get());
if (pAccDoc)
{
pAccDoc->SwitchViewFireFocus();
}
}
//Issue51656 Add resizeable margin on page preview from maoyg
void ScPreview::DragMove( long nDragMovePos, sal_uInt16 nFlags )
{
Fraction aPreviewZoom( nZoom, 100 );
Fraction aHorPrevZoom( (long)( 100 * nZoom / pDocShell->GetOutputFactor() ), 10000 );
MapMode aMMMode( MAP_100TH_MM, Point(), aHorPrevZoom, aPreviewZoom );
SetMapMode( aMMMode );
long nPos = nDragMovePos;
if( nFlags == POINTER_HSIZEBAR || nFlags == POINTER_HSPLIT )
{
if( nDragMovePos != aButtonDownChangePoint.X() )
{
DrawInvert( aButtonDownChangePoint.X(), nFlags );
aButtonDownChangePoint.X() = nPos;
DrawInvert( aButtonDownChangePoint.X(), nFlags );
}
}
else if( nFlags == POINTER_VSIZEBAR )
{
if( nDragMovePos != aButtonDownChangePoint.Y() )
{
DrawInvert( aButtonDownChangePoint.Y(), nFlags );
aButtonDownChangePoint.Y() = nPos;
DrawInvert( aButtonDownChangePoint.Y(), nFlags );
}
}
}
void ScPreview::DrawInvert( long nDragPos, sal_uInt16 nFlags )
{
long nHeight = (long) lcl_GetDocPageSize( pDocShell->GetDocument(), nTab ).Height();
long nWidth = (long) lcl_GetDocPageSize( pDocShell->GetDocument(), nTab ).Width();
if( nFlags == POINTER_HSIZEBAR || nFlags == POINTER_HSPLIT )
{
Rectangle aRect( nDragPos, -aOffset.Y(), nDragPos + 1,(long)( ( nHeight * HMM_PER_TWIPS ) - aOffset.Y()));
Invert( aRect,INVERT_50 );
}
else if( nFlags == POINTER_VSIZEBAR )
{
Rectangle aRect( -aOffset.X(), nDragPos,(long)( ( nWidth * HMM_PER_TWIPS ) - aOffset.X() ), nDragPos + 1 );
Invert( aRect,INVERT_50 );
}
}
//Issue51656 Add resizeable margin on page preview from maoyg