xref: /AOO41X/main/sc/source/ui/view/printfun.cxx (revision 590a31a18e48070419a1bd47d2fa79552e22b8de)
1b3f79822SAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3b3f79822SAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4b3f79822SAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5b3f79822SAndrew Rist  * distributed with this work for additional information
6b3f79822SAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7b3f79822SAndrew Rist  * to you under the Apache License, Version 2.0 (the
8b3f79822SAndrew Rist  * "License"); you may not use this file except in compliance
9b3f79822SAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11b3f79822SAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13b3f79822SAndrew Rist  * Unless required by applicable law or agreed to in writing,
14b3f79822SAndrew Rist  * software distributed under the License is distributed on an
15b3f79822SAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16b3f79822SAndrew Rist  * KIND, either express or implied.  See the License for the
17b3f79822SAndrew Rist  * specific language governing permissions and limitations
18b3f79822SAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20b3f79822SAndrew Rist  *************************************************************/
21b3f79822SAndrew Rist 
22b3f79822SAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sc.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
28cdf0e10cSrcweir 
29cdf0e10cSrcweir #include "scitems.hxx"
30cdf0e10cSrcweir #include <editeng/eeitem.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir #include "printfun.hxx"
33cdf0e10cSrcweir 
34cdf0e10cSrcweir #include <svx/svxids.hrc>
35cdf0e10cSrcweir #include <editeng/adjitem.hxx>
36cdf0e10cSrcweir #include <editeng/boxitem.hxx>
37cdf0e10cSrcweir #include <editeng/brshitem.hxx>
38cdf0e10cSrcweir #include <svtools/colorcfg.hxx>
39cdf0e10cSrcweir #include <editeng/editstat.hxx>		// EE_CNTRL_RTFSTYLESHEETS
40cdf0e10cSrcweir #include <svx/fmview.hxx>
41cdf0e10cSrcweir #include <editeng/frmdiritem.hxx>
42cdf0e10cSrcweir #include <editeng/lrspitem.hxx>
43cdf0e10cSrcweir #include <editeng/paperinf.hxx>
44cdf0e10cSrcweir #include <editeng/pbinitem.hxx>
45cdf0e10cSrcweir #include <editeng/shaditem.hxx>
46cdf0e10cSrcweir #include <editeng/sizeitem.hxx>
47cdf0e10cSrcweir #include <svx/svdpagv.hxx>
48cdf0e10cSrcweir #include <editeng/ulspitem.hxx>
49cdf0e10cSrcweir #include <sfx2/app.hxx>
50cdf0e10cSrcweir #include <sfx2/printer.hxx>
51cdf0e10cSrcweir #include <tools/multisel.hxx>
52cdf0e10cSrcweir #include <sfx2/docfile.hxx>
53cdf0e10cSrcweir #include <tools/urlobj.hxx>
54cdf0e10cSrcweir #include <svx/xoutbmp.hxx>
55cdf0e10cSrcweir 
56cdf0e10cSrcweir #include "editutil.hxx"
57cdf0e10cSrcweir #include "docsh.hxx"
58cdf0e10cSrcweir #include "output.hxx"
59cdf0e10cSrcweir #include "viewdata.hxx"
60cdf0e10cSrcweir #include "viewopti.hxx"
61cdf0e10cSrcweir #include "stlpool.hxx"
62cdf0e10cSrcweir #include "pagepar.hxx"
63cdf0e10cSrcweir #include "attrib.hxx"
64cdf0e10cSrcweir #include "patattr.hxx"
65cdf0e10cSrcweir #include "docpool.hxx"
66cdf0e10cSrcweir #include "dociter.hxx"
67cdf0e10cSrcweir #include "cell.hxx"
68cdf0e10cSrcweir #include "drawutil.hxx"
69cdf0e10cSrcweir #include "globstr.hrc"
70cdf0e10cSrcweir #include "scresid.hxx"
71cdf0e10cSrcweir #include "sc.hrc"
72cdf0e10cSrcweir #include "pagedata.hxx"
73cdf0e10cSrcweir #include "printopt.hxx"
74cdf0e10cSrcweir #include "prevloc.hxx"
75cdf0e10cSrcweir #include "scmod.hxx"
76cdf0e10cSrcweir #include "drwlayer.hxx"
77cdf0e10cSrcweir #include "fillinfo.hxx"
78cdf0e10cSrcweir #include "postit.hxx"
79cdf0e10cSrcweir 
80cdf0e10cSrcweir #include <vcl/lineinfo.hxx>
81cdf0e10cSrcweir #include <tools/pstm.hxx>
82cdf0e10cSrcweir 
83cdf0e10cSrcweir #include <boost/scoped_ptr.hpp>
84cdf0e10cSrcweir 
85cdf0e10cSrcweir #define ZOOM_MIN	10
86cdf0e10cSrcweir 
87cdf0e10cSrcweir #define GET_BOOL(set,which)   ((const SfxBoolItem&)(set)->Get((which))).GetValue()
88cdf0e10cSrcweir #define GET_USHORT(set,which) ((const SfxUInt16Item&)(set)->Get((which))).GetValue()
89cdf0e10cSrcweir #define GET_SHOW(set,which)   ( VOBJ_MODE_SHOW == ScVObjMode( ((const ScViewObjectModeItem&)(set)->Get((which))).GetValue()) )
90cdf0e10cSrcweir 
91cdf0e10cSrcweir //------------------------------------------------------------------------
92cdf0e10cSrcweir 
ScPageRowEntry(const ScPageRowEntry & r)93cdf0e10cSrcweir ScPageRowEntry::ScPageRowEntry(const ScPageRowEntry& r)
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	nStartRow = r.nStartRow;
96cdf0e10cSrcweir 	nEndRow	  = r.nEndRow;
97cdf0e10cSrcweir 	nPagesX   = r.nPagesX;
98cdf0e10cSrcweir 	if (r.pHidden && nPagesX)
99cdf0e10cSrcweir 	{
100cdf0e10cSrcweir 		pHidden = new sal_Bool[nPagesX];
101cdf0e10cSrcweir 		memcpy( pHidden, r.pHidden, nPagesX * sizeof(sal_Bool) );
102cdf0e10cSrcweir 	}
103cdf0e10cSrcweir 	else
104cdf0e10cSrcweir 		pHidden = NULL;
105cdf0e10cSrcweir }
106cdf0e10cSrcweir 
operator =(const ScPageRowEntry & r)107cdf0e10cSrcweir const ScPageRowEntry& ScPageRowEntry::operator=(const ScPageRowEntry& r)
108cdf0e10cSrcweir {
109cdf0e10cSrcweir 	delete[] pHidden;
110cdf0e10cSrcweir 
111cdf0e10cSrcweir 	nStartRow = r.nStartRow;
112cdf0e10cSrcweir 	nEndRow	  = r.nEndRow;
113cdf0e10cSrcweir 	nPagesX   = r.nPagesX;
114cdf0e10cSrcweir 	if (r.pHidden && nPagesX)
115cdf0e10cSrcweir 	{
116cdf0e10cSrcweir 		pHidden = new sal_Bool[nPagesX];
117cdf0e10cSrcweir 		memcpy( pHidden, r.pHidden, nPagesX * sizeof(sal_Bool) );
118cdf0e10cSrcweir 	}
119cdf0e10cSrcweir 	else
120cdf0e10cSrcweir 		pHidden = NULL;
121cdf0e10cSrcweir 
122cdf0e10cSrcweir 	return *this;
123cdf0e10cSrcweir }
124cdf0e10cSrcweir 
SetPagesX(size_t nNew)125cdf0e10cSrcweir void ScPageRowEntry::SetPagesX(size_t nNew)
126cdf0e10cSrcweir {
127cdf0e10cSrcweir 	if (pHidden)
128cdf0e10cSrcweir 	{
129cdf0e10cSrcweir 		DBG_ERROR("SetPagesX nicht nach SetHidden");
130cdf0e10cSrcweir 		delete[] pHidden;
131cdf0e10cSrcweir 		pHidden = NULL;
132cdf0e10cSrcweir 	}
133cdf0e10cSrcweir 	nPagesX = nNew;
134cdf0e10cSrcweir }
135cdf0e10cSrcweir 
SetHidden(size_t nX)136cdf0e10cSrcweir void ScPageRowEntry::SetHidden(size_t nX)
137cdf0e10cSrcweir {
138cdf0e10cSrcweir 	if ( nX < nPagesX )
139cdf0e10cSrcweir 	{
140cdf0e10cSrcweir 		if ( nX+1 == nPagesX )	// letzte Seite?
141cdf0e10cSrcweir 			--nPagesX;
142cdf0e10cSrcweir 		else
143cdf0e10cSrcweir 		{
144cdf0e10cSrcweir 			if (!pHidden)
145cdf0e10cSrcweir 			{
146cdf0e10cSrcweir 				pHidden = new sal_Bool[nPagesX];
147cdf0e10cSrcweir 				memset( pHidden, sal_False, nPagesX * sizeof(sal_Bool) );
148cdf0e10cSrcweir 			}
149cdf0e10cSrcweir 			pHidden[nX] = sal_True;
150cdf0e10cSrcweir 		}
151cdf0e10cSrcweir 	}
152cdf0e10cSrcweir }
153cdf0e10cSrcweir 
IsHidden(size_t nX) const154cdf0e10cSrcweir sal_Bool ScPageRowEntry::IsHidden(size_t nX) const
155cdf0e10cSrcweir {
156cdf0e10cSrcweir 	return nX>=nPagesX || ( pHidden && pHidden[nX] );		//! inline?
157cdf0e10cSrcweir }
158cdf0e10cSrcweir 
CountVisible() const159cdf0e10cSrcweir size_t ScPageRowEntry::CountVisible() const
160cdf0e10cSrcweir {
161cdf0e10cSrcweir 	if ( pHidden )
162cdf0e10cSrcweir 	{
163cdf0e10cSrcweir 		size_t nVis = 0;
164cdf0e10cSrcweir 		for (size_t i=0; i<nPagesX; i++)
165cdf0e10cSrcweir 			if (!pHidden[i])
166cdf0e10cSrcweir 				++nVis;
167cdf0e10cSrcweir 		return nVis;
168cdf0e10cSrcweir 	}
169cdf0e10cSrcweir 	else
170cdf0e10cSrcweir 		return nPagesX;
171cdf0e10cSrcweir }
172cdf0e10cSrcweir 
173cdf0e10cSrcweir //------------------------------------------------------------------------
174cdf0e10cSrcweir 
lcl_LineTotal(const SvxBorderLine * pLine)175cdf0e10cSrcweir long lcl_LineTotal(const SvxBorderLine* pLine)
176cdf0e10cSrcweir {
177cdf0e10cSrcweir 	return pLine ? ( pLine->GetOutWidth() + pLine->GetInWidth() + pLine->GetDistance() ) : 0;
178cdf0e10cSrcweir }
179cdf0e10cSrcweir 
Construct(const ScPrintOptions * pOptions)180cdf0e10cSrcweir void ScPrintFunc::Construct( const ScPrintOptions* pOptions )
181cdf0e10cSrcweir {
182cdf0e10cSrcweir     pDocShell->UpdatePendingRowHeights( nPrintTab );
183cdf0e10cSrcweir 	pDoc = pDocShell->GetDocument();
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 	SfxPrinter* pDocPrinter = pDoc->GetPrinter();	// auch fuer Preview den Drucker nehmen
186cdf0e10cSrcweir 	if (pDocPrinter)
187cdf0e10cSrcweir 		aOldPrinterMode = pDocPrinter->GetMapMode();
188cdf0e10cSrcweir 
189cdf0e10cSrcweir 	//	einheitlicher MapMode ueber alle Aufrufe (z.B. Repaint !!!),
190cdf0e10cSrcweir 	//	weil die EditEngine sonst unterschiedliche Texthoehen liefert
191cdf0e10cSrcweir 	pDev->SetMapMode(MAP_PIXEL);
192cdf0e10cSrcweir 
193cdf0e10cSrcweir 	pBorderItem = NULL;
194cdf0e10cSrcweir 	pBackgroundItem = NULL;
195cdf0e10cSrcweir 	pShadowItem = NULL;
196cdf0e10cSrcweir 
197cdf0e10cSrcweir 	pEditEngine = NULL;
198cdf0e10cSrcweir 	pEditDefaults = NULL;
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 	ScStyleSheetPool* pStylePool	= pDoc->GetStyleSheetPool();
201cdf0e10cSrcweir 	SfxStyleSheetBase* pStyleSheet  = pStylePool->Find(
202cdf0e10cSrcweir 											pDoc->GetPageStyle( nPrintTab ),
203cdf0e10cSrcweir 											SFX_STYLE_FAMILY_PAGE );
204cdf0e10cSrcweir 	if (pStyleSheet)
205cdf0e10cSrcweir 		pParamSet = &pStyleSheet->GetItemSet();
206cdf0e10cSrcweir 	else
207cdf0e10cSrcweir 	{
208cdf0e10cSrcweir 		DBG_ERROR("Seitenvorlage nicht gefunden" );
209cdf0e10cSrcweir 		pParamSet = NULL;
210cdf0e10cSrcweir 	}
211cdf0e10cSrcweir 
212cdf0e10cSrcweir 	if (!bState)
213cdf0e10cSrcweir 		nZoom = 100;
214cdf0e10cSrcweir 	nManualZoom = 100;
215cdf0e10cSrcweir 	bClearWin = sal_False;
216cdf0e10cSrcweir 	bUseStyleColor = sal_False;
217cdf0e10cSrcweir 	bIsRender = sal_False;
218cdf0e10cSrcweir 
219cdf0e10cSrcweir 	InitParam(pOptions);
220cdf0e10cSrcweir 
221cdf0e10cSrcweir 	pPageData = NULL;		// wird nur zur Initialisierung gebraucht
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
ScPrintFunc(ScDocShell * pShell,SfxPrinter * pNewPrinter,SCTAB nTab,long nPage,long nDocP,const ScRange * pArea,const ScPrintOptions * pOptions,ScPageBreakData * pData)224cdf0e10cSrcweir ScPrintFunc::ScPrintFunc( ScDocShell* pShell, SfxPrinter* pNewPrinter, SCTAB nTab,
225cdf0e10cSrcweir 							long nPage, long nDocP, const ScRange* pArea,
226cdf0e10cSrcweir 							const ScPrintOptions* pOptions,
227cdf0e10cSrcweir 							ScPageBreakData* pData )
228cdf0e10cSrcweir 	:	pDocShell			( pShell ),
229cdf0e10cSrcweir 		pPrinter			( pNewPrinter ),
230cdf0e10cSrcweir 		pDrawView			( NULL ),
231cdf0e10cSrcweir 		nPrintTab			( nTab ),
232cdf0e10cSrcweir 		nPageStart			( nPage ),
233cdf0e10cSrcweir 		nDocPages			( nDocP ),
234cdf0e10cSrcweir 		pUserArea			( pArea ),
235cdf0e10cSrcweir 		bState				( sal_False ),
236cdf0e10cSrcweir 		bSourceRangeValid	( sal_False ),
237cdf0e10cSrcweir 		bPrintCurrentTable	( sal_False ),
238cdf0e10cSrcweir 		bMultiArea			( sal_False ),
239cdf0e10cSrcweir 		nTabPages			( 0 ),
240cdf0e10cSrcweir 		nTotalPages			( 0 ),
241cdf0e10cSrcweir 		pPageData			( pData )
242cdf0e10cSrcweir {
243cdf0e10cSrcweir 	pDev = pPrinter;
244cdf0e10cSrcweir 	aSrcOffset = pPrinter->PixelToLogic( pPrinter->GetPageOffsetPixel(), MAP_100TH_MM );
245cdf0e10cSrcweir 	Construct( pOptions );
246cdf0e10cSrcweir }
247cdf0e10cSrcweir 
ScPrintFunc(OutputDevice * pOutDev,ScDocShell * pShell,SCTAB nTab,long nPage,long nDocP,const ScRange * pArea,const ScPrintOptions * pOptions)248cdf0e10cSrcweir ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell, SCTAB nTab,
249cdf0e10cSrcweir 							long nPage, long nDocP, const ScRange* pArea,
250cdf0e10cSrcweir 							const ScPrintOptions* pOptions )
251cdf0e10cSrcweir 	:	pDocShell			( pShell ),
252cdf0e10cSrcweir 		pPrinter			( NULL ),
253cdf0e10cSrcweir 		pDrawView			( NULL ),
254cdf0e10cSrcweir 		nPrintTab			( nTab ),
255cdf0e10cSrcweir 		nPageStart			( nPage ),
256cdf0e10cSrcweir 		nDocPages			( nDocP ),
257cdf0e10cSrcweir 		pUserArea			( pArea ),
258cdf0e10cSrcweir 		bState				( sal_False ),
259cdf0e10cSrcweir 		bSourceRangeValid	( sal_False ),
260cdf0e10cSrcweir 		bPrintCurrentTable	( sal_False ),
261cdf0e10cSrcweir 		bMultiArea			( sal_False ),
262cdf0e10cSrcweir 		nTabPages			( 0 ),
263cdf0e10cSrcweir 		nTotalPages			( 0 ),
264cdf0e10cSrcweir 		pPageData			( NULL )
265cdf0e10cSrcweir {
266cdf0e10cSrcweir 	pDev = pOutDev;
267cdf0e10cSrcweir 	Construct( pOptions );
268cdf0e10cSrcweir }
269cdf0e10cSrcweir 
ScPrintFunc(OutputDevice * pOutDev,ScDocShell * pShell,const ScPrintState & rState,const ScPrintOptions * pOptions)270cdf0e10cSrcweir ScPrintFunc::ScPrintFunc( OutputDevice* pOutDev, ScDocShell* pShell,
271cdf0e10cSrcweir 							 const ScPrintState& rState, const ScPrintOptions* pOptions )
272cdf0e10cSrcweir 	:	pDocShell			( pShell ),
273cdf0e10cSrcweir 		pPrinter			( NULL ),
274cdf0e10cSrcweir 		pDrawView			( NULL ),
275cdf0e10cSrcweir 		pUserArea			( NULL ),
276cdf0e10cSrcweir 		bSourceRangeValid	( sal_False ),
277cdf0e10cSrcweir 		bPrintCurrentTable	( sal_False ),
278cdf0e10cSrcweir 		bMultiArea			( sal_False ),
279cdf0e10cSrcweir 		pPageData			( NULL )
280cdf0e10cSrcweir {
281cdf0e10cSrcweir 	pDev = pOutDev;
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 	nPrintTab	= rState.nPrintTab;
284cdf0e10cSrcweir 	nStartCol	= rState.nStartCol;
285cdf0e10cSrcweir 	nStartRow	= rState.nStartRow;
286cdf0e10cSrcweir 	nEndCol		= rState.nEndCol;
287cdf0e10cSrcweir 	nEndRow		= rState.nEndRow;
288cdf0e10cSrcweir 	nZoom		= rState.nZoom;
289cdf0e10cSrcweir 	nPagesX		= rState.nPagesX;
290cdf0e10cSrcweir 	nPagesY		= rState.nPagesY;
291cdf0e10cSrcweir 	nTabPages	= rState.nTabPages;
292cdf0e10cSrcweir 	nTotalPages	= rState.nTotalPages;
293cdf0e10cSrcweir 	nPageStart	= rState.nPageStart;
294cdf0e10cSrcweir 	nDocPages	= rState.nDocPages;
295cdf0e10cSrcweir 	bState		= sal_True;
296cdf0e10cSrcweir 
297cdf0e10cSrcweir 	Construct( pOptions );
298cdf0e10cSrcweir }
299cdf0e10cSrcweir 
GetPrintState(ScPrintState & rState)300cdf0e10cSrcweir void ScPrintFunc::GetPrintState( ScPrintState& rState )
301cdf0e10cSrcweir {
302cdf0e10cSrcweir 	rState.nPrintTab	= nPrintTab;
303cdf0e10cSrcweir 	rState.nStartCol	= nStartCol;
304cdf0e10cSrcweir 	rState.nStartRow	= nStartRow;
305cdf0e10cSrcweir 	rState.nEndCol		= nEndCol;
306cdf0e10cSrcweir 	rState.nEndRow		= nEndRow;
307cdf0e10cSrcweir 	rState.nZoom		= nZoom;
308cdf0e10cSrcweir 	rState.nPagesX		= nPagesX;
309cdf0e10cSrcweir 	rState.nPagesY		= nPagesY;
310cdf0e10cSrcweir 	rState.nTabPages	= nTabPages;
311cdf0e10cSrcweir 	rState.nTotalPages	= nTotalPages;
312cdf0e10cSrcweir 	rState.nPageStart	= nPageStart;
313cdf0e10cSrcweir 	rState.nDocPages	= nDocPages;
314cdf0e10cSrcweir }
315cdf0e10cSrcweir 
GetLastSourceRange(ScRange & rRange) const316cdf0e10cSrcweir sal_Bool ScPrintFunc::GetLastSourceRange( ScRange& rRange ) const
317cdf0e10cSrcweir {
318cdf0e10cSrcweir 	rRange = aLastSourceRange;
319cdf0e10cSrcweir 	return bSourceRangeValid;
320cdf0e10cSrcweir }
321cdf0e10cSrcweir 
FillPageData()322cdf0e10cSrcweir void ScPrintFunc::FillPageData()
323cdf0e10cSrcweir {
324cdf0e10cSrcweir 	if (pPageData)
325cdf0e10cSrcweir 	{
326cdf0e10cSrcweir         sal_uInt16 nCount = sal::static_int_cast<sal_uInt16>( pPageData->GetCount() );
327cdf0e10cSrcweir 		ScPrintRangeData& rData = pPageData->GetData(nCount);		// hochzaehlen
328cdf0e10cSrcweir 
329cdf0e10cSrcweir 		rData.SetPrintRange( ScRange( nStartCol, nStartRow, nPrintTab,
330cdf0e10cSrcweir 										nEndCol, nEndRow, nPrintTab ) );
331*590a31a1SArmin Le Grand         // #123672#
332*590a31a1SArmin Le Grand         if(maPageEndX.empty())
333*590a31a1SArmin Le Grand         {
334*590a31a1SArmin Le Grand             OSL_ENSURE(false, "vector access error for maPageEndX (!)");
335*590a31a1SArmin Le Grand         }
336*590a31a1SArmin Le Grand         else
337*590a31a1SArmin Le Grand         {
338*590a31a1SArmin Le Grand             rData.SetPagesX( nPagesX, &maPageEndX[0]);
339*590a31a1SArmin Le Grand         }
340*590a31a1SArmin Le Grand 
341*590a31a1SArmin Le Grand         // #123672#
342*590a31a1SArmin Le Grand         if(maPageEndY.empty())
343*590a31a1SArmin Le Grand         {
344*590a31a1SArmin Le Grand             OSL_ENSURE(false, "vector access error for maPageEndY (!)");
345*590a31a1SArmin Le Grand         }
346*590a31a1SArmin Le Grand         else
347*590a31a1SArmin Le Grand         {
348*590a31a1SArmin Le Grand             rData.SetPagesY( nTotalY, &maPageEndY[0]);
349*590a31a1SArmin Le Grand         }
350cdf0e10cSrcweir 
351cdf0e10cSrcweir 		//	Einstellungen
352cdf0e10cSrcweir 		rData.SetTopDown( aTableParam.bTopDown );
353cdf0e10cSrcweir 		rData.SetAutomatic( !aAreaParam.bPrintArea );
354cdf0e10cSrcweir 	}
355cdf0e10cSrcweir }
356cdf0e10cSrcweir 
~ScPrintFunc()357cdf0e10cSrcweir ScPrintFunc::~ScPrintFunc()
358cdf0e10cSrcweir {
359cdf0e10cSrcweir 	ScAddress* pTripel = (ScAddress*) aNotePosList.First();
360cdf0e10cSrcweir 	while (pTripel)
361cdf0e10cSrcweir 	{
362cdf0e10cSrcweir 		delete pTripel;
363cdf0e10cSrcweir 		pTripel = (ScAddress*) aNotePosList.Next();
364cdf0e10cSrcweir 	}
365cdf0e10cSrcweir 	aNotePosList.Clear();
366cdf0e10cSrcweir 
367cdf0e10cSrcweir 	delete pEditDefaults;
368cdf0e10cSrcweir 	delete pEditEngine;
369cdf0e10cSrcweir 
370cdf0e10cSrcweir 	//	Druckereinstellungen werden jetzt von aussen wiederhergestellt
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 	//	#64294# Fuer DrawingLayer/Charts muss der MapMode am Drucker (RefDevice) immer stimmen
373cdf0e10cSrcweir 	SfxPrinter* pDocPrinter = pDoc->GetPrinter();	// auch fuer Preview den Drucker nehmen
374cdf0e10cSrcweir 	if (pDocPrinter)
375cdf0e10cSrcweir 		pDocPrinter->SetMapMode(aOldPrinterMode);
376cdf0e10cSrcweir }
377cdf0e10cSrcweir 
SetDrawView(FmFormView * pNew)378cdf0e10cSrcweir void ScPrintFunc::SetDrawView( FmFormView* pNew )
379cdf0e10cSrcweir {
380cdf0e10cSrcweir 	pDrawView = pNew;
381cdf0e10cSrcweir }
382cdf0e10cSrcweir 
lcl_HidePrint(ScTableInfo & rTabInfo,SCCOL nX1,SCCOL nX2)383cdf0e10cSrcweir void lcl_HidePrint( ScTableInfo& rTabInfo, SCCOL nX1, SCCOL nX2 )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir     for (SCSIZE nArrY=1; nArrY+1<rTabInfo.mnArrCount; nArrY++)
386cdf0e10cSrcweir 	{
387cdf0e10cSrcweir         RowInfo* pThisRowInfo = &rTabInfo.mpRowInfo[nArrY];
388cdf0e10cSrcweir 		for (SCCOL nX=nX1; nX<=nX2; nX++)
389cdf0e10cSrcweir 		{
390cdf0e10cSrcweir 			const CellInfo& rCellInfo = pThisRowInfo->pCellInfo[nX+1];
391cdf0e10cSrcweir 			if (!rCellInfo.bEmptyCellText)
392cdf0e10cSrcweir 				if (((const ScProtectionAttr&)rCellInfo.pPatternAttr->
393cdf0e10cSrcweir 							GetItem(ATTR_PROTECTION, rCellInfo.pConditionSet)).GetHidePrint())
394cdf0e10cSrcweir 				{
395cdf0e10cSrcweir 					pThisRowInfo->pCellInfo[nX+1].pCell			 = NULL;
396cdf0e10cSrcweir 					pThisRowInfo->pCellInfo[nX+1].bEmptyCellText = sal_True;
397cdf0e10cSrcweir 				}
398cdf0e10cSrcweir 		}
399cdf0e10cSrcweir 	}
400cdf0e10cSrcweir }
401cdf0e10cSrcweir 
402cdf0e10cSrcweir //
403cdf0e10cSrcweir //			Ausgabe auf Device (static)
404cdf0e10cSrcweir //
405cdf0e10cSrcweir //		wird benutzt fuer:
406cdf0e10cSrcweir //		-	Clipboard/Bitmap
407cdf0e10cSrcweir //		-	Ole-Object (DocShell::Draw)
408cdf0e10cSrcweir //		-	Vorschau bei Vorlagen
409cdf0e10cSrcweir 
DrawToDev(ScDocument * pDoc,OutputDevice * pDev,double,const Rectangle & rBound,ScViewData * pViewData,sal_Bool bMetaFile)410cdf0e10cSrcweir void ScPrintFunc::DrawToDev( ScDocument* pDoc, OutputDevice* pDev, double /* nPrintFactor */,
411cdf0e10cSrcweir 							const Rectangle& rBound, ScViewData* pViewData, sal_Bool bMetaFile )
412cdf0e10cSrcweir {
413cdf0e10cSrcweir 	//!	nPrintFactor auswerten !!!
414cdf0e10cSrcweir 
415cdf0e10cSrcweir 	SCTAB nTab = 0;
416cdf0e10cSrcweir 	if (pViewData)
417cdf0e10cSrcweir 		nTab = pViewData->GetTabNo();
418cdf0e10cSrcweir 
419cdf0e10cSrcweir 	sal_Bool bDoGrid, bNullVal, bFormula;
420cdf0e10cSrcweir 	ScStyleSheetPool* pStylePool = pDoc->GetStyleSheetPool();
421cdf0e10cSrcweir 	SfxStyleSheetBase* pStyleSheet = pStylePool->Find( pDoc->GetPageStyle( nTab ), SFX_STYLE_FAMILY_PAGE );
422cdf0e10cSrcweir 	if (pStyleSheet)
423cdf0e10cSrcweir 	{
424cdf0e10cSrcweir 		SfxItemSet& rSet = pStyleSheet->GetItemSet();
425cdf0e10cSrcweir 		bDoGrid  = ((const SfxBoolItem&)rSet.Get(ATTR_PAGE_GRID)).GetValue();
426cdf0e10cSrcweir 		bNullVal = ((const SfxBoolItem&)rSet.Get(ATTR_PAGE_NULLVALS)).GetValue();
427cdf0e10cSrcweir 		bFormula = ((const SfxBoolItem&)rSet.Get(ATTR_PAGE_FORMULAS)).GetValue();
428cdf0e10cSrcweir 	}
429cdf0e10cSrcweir 	else
430cdf0e10cSrcweir 	{
431cdf0e10cSrcweir 		const ScViewOptions& rOpt = pDoc->GetViewOptions();
432cdf0e10cSrcweir 		bDoGrid  = rOpt.GetOption(VOPT_GRID);
433cdf0e10cSrcweir 		bNullVal = rOpt.GetOption(VOPT_NULLVALS);
434cdf0e10cSrcweir 		bFormula = rOpt.GetOption(VOPT_FORMULAS);
435cdf0e10cSrcweir 	}
436cdf0e10cSrcweir 
437cdf0e10cSrcweir 	MapMode aMode = pDev->GetMapMode();
438cdf0e10cSrcweir 
439cdf0e10cSrcweir 	Rectangle aRect = rBound;
440cdf0e10cSrcweir 
441cdf0e10cSrcweir 	if (aRect.Right() < aRect.Left() || aRect.Bottom() < aRect.Top())
442cdf0e10cSrcweir 		aRect = Rectangle( Point(), pDev->GetOutputSize() );
443cdf0e10cSrcweir 
444cdf0e10cSrcweir 	SCCOL nX1 = 0;
445cdf0e10cSrcweir 	SCROW nY1 = 0;
446cdf0e10cSrcweir 	SCCOL nX2 = OLE_STD_CELLS_X - 1;
447cdf0e10cSrcweir 	SCROW nY2 = OLE_STD_CELLS_Y - 1;
448cdf0e10cSrcweir 	if (bMetaFile)
449cdf0e10cSrcweir 	{
450cdf0e10cSrcweir 		ScRange aRange = pDoc->GetRange( nTab, rBound );
451cdf0e10cSrcweir 		nX1 = aRange.aStart.Col();
452cdf0e10cSrcweir 		nY1 = aRange.aStart.Row();
453cdf0e10cSrcweir 		nX2 = aRange.aEnd.Col();
454cdf0e10cSrcweir 		nY2 = aRange.aEnd.Row();
455cdf0e10cSrcweir 	}
456cdf0e10cSrcweir 	else if (pViewData)
457cdf0e10cSrcweir 	{
458cdf0e10cSrcweir 		ScSplitPos eWhich = pViewData->GetActivePart();
459cdf0e10cSrcweir 		ScHSplitPos eHWhich = WhichH(eWhich);
460cdf0e10cSrcweir 		ScVSplitPos eVWhich = WhichV(eWhich);
461cdf0e10cSrcweir 		nX1 = pViewData->GetPosX(eHWhich);
462cdf0e10cSrcweir 		nY1 = pViewData->GetPosY(eVWhich);
463cdf0e10cSrcweir 		nX2 = nX1 + pViewData->VisibleCellsX(eHWhich);
464cdf0e10cSrcweir 		if (nX2>nX1) --nX2;
465cdf0e10cSrcweir 		nY2 = nY1 + pViewData->VisibleCellsY(eVWhich);
466cdf0e10cSrcweir 		if (nY2>nY1) --nY2;
467cdf0e10cSrcweir 	}
468cdf0e10cSrcweir 
469cdf0e10cSrcweir 	if (nX1 > MAXCOL) nX1 = MAXCOL;
470cdf0e10cSrcweir 	if (nX2 > MAXCOL) nX2 = MAXCOL;
471cdf0e10cSrcweir 	if (nY1 > MAXROW) nY1 = MAXROW;
472cdf0e10cSrcweir 	if (nY2 > MAXROW) nY2 = MAXROW;
473cdf0e10cSrcweir 
474cdf0e10cSrcweir 	long nDevSizeX = aRect.Right()-aRect.Left()+1;
475cdf0e10cSrcweir 	long nDevSizeY = aRect.Bottom()-aRect.Top()+1;
476cdf0e10cSrcweir 
477cdf0e10cSrcweir 	Rectangle aLines;
478cdf0e10cSrcweir 	ScRange aRange( nX1,nY1,nTab, nX2,nY2,nTab );
479cdf0e10cSrcweir //    sal_Bool bAddLines = pDoc->HasLines( aRange, aLines );
480cdf0e10cSrcweir 
481cdf0e10cSrcweir 	long nTwipsSizeX = 0;
482cdf0e10cSrcweir 	for (SCCOL i=nX1; i<=nX2; i++)
483cdf0e10cSrcweir 		nTwipsSizeX += pDoc->GetColWidth( i, nTab );
484cdf0e10cSrcweir 	long nTwipsSizeY = (long) pDoc->GetRowHeight( nY1, nY2, nTab );
485cdf0e10cSrcweir 
486cdf0e10cSrcweir 	//	wenn keine Linien, dann trotzdem Platz fuer den Aussenrahmen (20 Twips = 1pt)
487cdf0e10cSrcweir 	//	(HasLines initalisiert aLines auf 0,0,0,0)
488cdf0e10cSrcweir 	nTwipsSizeX += aLines.Left() + Max( aLines.Right(), 20L );
489cdf0e10cSrcweir 	nTwipsSizeY += aLines.Top() +  Max( aLines.Bottom(), 20L );
490cdf0e10cSrcweir 
491cdf0e10cSrcweir 	double nScaleX = (double) nDevSizeX / nTwipsSizeX;
492cdf0e10cSrcweir 	double nScaleY = (double) nDevSizeY / nTwipsSizeY;
493cdf0e10cSrcweir 
494cdf0e10cSrcweir 							//!		Flag bei FillInfo uebergeben !!!!!
495cdf0e10cSrcweir     ScRange aERange;
496cdf0e10cSrcweir 	sal_Bool bEmbed = pDoc->IsEmbedded();
497cdf0e10cSrcweir 	if (bEmbed)
498cdf0e10cSrcweir 	{
499cdf0e10cSrcweir 		pDoc->GetEmbedded(aERange);
500cdf0e10cSrcweir 		pDoc->ResetEmbedded();
501cdf0e10cSrcweir 	}
502cdf0e10cSrcweir 
503cdf0e10cSrcweir 	//	Daten zusammenstellen
504cdf0e10cSrcweir 
505cdf0e10cSrcweir     ScTableInfo aTabInfo;
506cdf0e10cSrcweir     pDoc->FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nTab,
507cdf0e10cSrcweir 										nScaleX, nScaleY, sal_False, bFormula );
508cdf0e10cSrcweir     lcl_HidePrint( aTabInfo, nX1, nX2 );
509cdf0e10cSrcweir 
510cdf0e10cSrcweir 	if (bEmbed)
511cdf0e10cSrcweir 		pDoc->SetEmbedded(aERange);
512cdf0e10cSrcweir 
513cdf0e10cSrcweir /*	if (!bMetaFile)
514cdf0e10cSrcweir 		pDev->SetMapMode(MAP_PIXEL);
515cdf0e10cSrcweir */
516cdf0e10cSrcweir 	long nScrX = aRect.Left();
517cdf0e10cSrcweir 	long nScrY = aRect.Top();
518cdf0e10cSrcweir 
519cdf0e10cSrcweir 	//	Wenn keine Linien, trotzdem Platz fuer Gitterlinien lassen
520cdf0e10cSrcweir 	//	(werden sonst abgeschnitten)
521cdf0e10cSrcweir 	long nAddX = (long)( aLines.Left() * nScaleX );
522cdf0e10cSrcweir 	nScrX += ( nAddX ? nAddX : 1 );
523cdf0e10cSrcweir 	long nAddY = (long)( aLines.Top() * nScaleY );
524cdf0e10cSrcweir 	nScrY += ( nAddY ? nAddY : 1 );
525cdf0e10cSrcweir 
526cdf0e10cSrcweir     ScOutputData aOutputData( pDev, OUTTYPE_PRINTER, aTabInfo, pDoc, nTab,
527cdf0e10cSrcweir 								nScrX, nScrY, nX1, nY1, nX2, nY2, nScaleX, nScaleY );
528cdf0e10cSrcweir 	aOutputData.SetMetaFileMode(bMetaFile);
529cdf0e10cSrcweir 	aOutputData.SetShowNullValues(bNullVal);
530cdf0e10cSrcweir 	aOutputData.SetShowFormulas(bFormula);
531cdf0e10cSrcweir 
532cdf0e10cSrcweir 	// #114135#
533cdf0e10cSrcweir 	ScDrawLayer* pModel = pDoc->GetDrawLayer();
534cdf0e10cSrcweir 	FmFormView* pDrawView = NULL;
535cdf0e10cSrcweir 
536cdf0e10cSrcweir 	if( pModel )
537cdf0e10cSrcweir 	{
538cdf0e10cSrcweir 		pDrawView = new FmFormView( pModel, pDev );
539cdf0e10cSrcweir 		pDrawView->ShowSdrPage(pDrawView->GetModel()->GetPage(nTab));
540cdf0e10cSrcweir 		pDrawView->SetPrintPreview( sal_True );
541cdf0e10cSrcweir 		aOutputData.SetDrawView( pDrawView );
542cdf0e10cSrcweir 	}
543cdf0e10cSrcweir 
544cdf0e10cSrcweir 	//!	SetUseStyleColor ??
545cdf0e10cSrcweir 
546cdf0e10cSrcweir 	if ( bMetaFile && pDev->GetOutDevType() == OUTDEV_VIRDEV )
547cdf0e10cSrcweir 		aOutputData.SetSnapPixel();
548cdf0e10cSrcweir 
549cdf0e10cSrcweir 	Point aLogStart = pDev->PixelToLogic( Point(nScrX,nScrY), MAP_100TH_MM );
550cdf0e10cSrcweir 	long nLogStX = aLogStart.X();
551cdf0e10cSrcweir 	long nLogStY = aLogStart.Y();
552cdf0e10cSrcweir 
553cdf0e10cSrcweir 	//!		nZoom fuer GetFont in OutputData ???
554cdf0e10cSrcweir 
555cdf0e10cSrcweir 	if (!bMetaFile && pViewData)
556cdf0e10cSrcweir 		pDev->SetMapMode(pViewData->GetLogicMode(pViewData->GetActivePart()));
557cdf0e10cSrcweir 
558cdf0e10cSrcweir 	// #i72502#
559cdf0e10cSrcweir 	const Point aMMOffset(aOutputData.PrePrintDrawingLayer(nLogStX, nLogStY));
560cdf0e10cSrcweir 	aOutputData.PrintDrawingLayer(SC_LAYER_BACK, aMMOffset);
561cdf0e10cSrcweir 
562cdf0e10cSrcweir 	if (!bMetaFile && pViewData)
563cdf0e10cSrcweir 		pDev->SetMapMode(aMode);
564cdf0e10cSrcweir 
565cdf0e10cSrcweir 	aOutputData.DrawBackground();
566cdf0e10cSrcweir 
567cdf0e10cSrcweir #ifdef OS2
568cdf0e10cSrcweir 	if (bMetaFile && !bDoGrid)
569cdf0e10cSrcweir 	{
570cdf0e10cSrcweir 					// unter OS2 fuer Metafiles gesamte Flaeche benutzen,
571cdf0e10cSrcweir 					// weil sonst die Groesse nicht erkannt wird
572cdf0e10cSrcweir 		pDev->SetLineColor();
573cdf0e10cSrcweir 		pDev->SetFillColor();
574cdf0e10cSrcweir 		pDev->DrawRect( Rectangle( nScrX,nScrY,
575cdf0e10cSrcweir 						nScrX+aOutputData.GetScrW(), nScrY+aOutputData.GetScrH() ) );
576cdf0e10cSrcweir 	}
577cdf0e10cSrcweir #endif
578cdf0e10cSrcweir 
579cdf0e10cSrcweir 	aOutputData.DrawShadow();
580cdf0e10cSrcweir 	aOutputData.DrawFrame();
581cdf0e10cSrcweir 	aOutputData.DrawStrings();
582cdf0e10cSrcweir 
583cdf0e10cSrcweir 	if (!bMetaFile && pViewData)
584cdf0e10cSrcweir 		pDev->SetMapMode(pViewData->GetLogicMode(pViewData->GetActivePart()));
585cdf0e10cSrcweir 
586cdf0e10cSrcweir 	aOutputData.DrawEdit(!bMetaFile);
587cdf0e10cSrcweir 
588cdf0e10cSrcweir 	if (bDoGrid)
589cdf0e10cSrcweir 	{
590cdf0e10cSrcweir 		if (!bMetaFile && pViewData)
591cdf0e10cSrcweir 			pDev->SetMapMode(aMode);
592cdf0e10cSrcweir 
593cdf0e10cSrcweir 		aOutputData.DrawGrid( sal_True, sal_False );	// keine Seitenumbrueche
594cdf0e10cSrcweir 
595cdf0e10cSrcweir 		pDev->SetLineColor( COL_BLACK );
596cdf0e10cSrcweir 
597cdf0e10cSrcweir 		Size aOne = pDev->PixelToLogic( Size(1,1) );
598cdf0e10cSrcweir 		if (bMetaFile)
599cdf0e10cSrcweir 			aOne = Size(1,1);	// compatible with DrawGrid
600cdf0e10cSrcweir 		long nRight = nScrX + aOutputData.GetScrW() - aOne.Width();
601cdf0e10cSrcweir 		long nBottom = nScrY + aOutputData.GetScrH() - aOne.Height();
602cdf0e10cSrcweir 
603cdf0e10cSrcweir 		sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nTab );
604cdf0e10cSrcweir 
605cdf0e10cSrcweir 		// extra line at the left edge for left-to-right, right for right-to-left
606cdf0e10cSrcweir 		if ( bLayoutRTL )
607cdf0e10cSrcweir 			pDev->DrawLine( Point(nRight,nScrY), Point(nRight,nBottom) );
608cdf0e10cSrcweir 		else
609cdf0e10cSrcweir 			pDev->DrawLine( Point(nScrX,nScrY), Point(nScrX,nBottom) );
610cdf0e10cSrcweir 		// extra line at the top in both cases
611cdf0e10cSrcweir 		pDev->DrawLine( Point(nScrX,nScrY), Point(nRight,nScrY) );
612cdf0e10cSrcweir 	}
613cdf0e10cSrcweir 
614cdf0e10cSrcweir 	// #i72502#
615cdf0e10cSrcweir 	aOutputData.PrintDrawingLayer(SC_LAYER_FRONT, aMMOffset);
616cdf0e10cSrcweir 	aOutputData.PrintDrawingLayer(SC_LAYER_INTERN, aMMOffset);
617cdf0e10cSrcweir 	aOutputData.PostPrintDrawingLayer(aMMOffset); // #i74768#
618cdf0e10cSrcweir 
619cdf0e10cSrcweir 	// #114135#
620cdf0e10cSrcweir 	delete pDrawView;
621cdf0e10cSrcweir }
622cdf0e10cSrcweir 
623cdf0e10cSrcweir //
624cdf0e10cSrcweir //			Drucken
625cdf0e10cSrcweir //
626cdf0e10cSrcweir 
lcl_FillHFParam(ScPrintHFParam & rParam,const SfxItemSet * pHFSet)627cdf0e10cSrcweir void lcl_FillHFParam( ScPrintHFParam& rParam, const SfxItemSet* pHFSet )
628cdf0e10cSrcweir {
629cdf0e10cSrcweir 	//	nDistance muss vorher unterschiedlich initalisiert sein
630cdf0e10cSrcweir 
631cdf0e10cSrcweir 	if ( pHFSet == NULL )
632cdf0e10cSrcweir 	{
633cdf0e10cSrcweir 		rParam.bEnable	= sal_False;
634cdf0e10cSrcweir 		rParam.pBorder	= NULL;
635cdf0e10cSrcweir 		rParam.pBack	= NULL;
636cdf0e10cSrcweir 		rParam.pShadow	= NULL;
637cdf0e10cSrcweir 	}
638cdf0e10cSrcweir 	else
639cdf0e10cSrcweir 	{
640cdf0e10cSrcweir 		rParam.bEnable	= ((const SfxBoolItem&) pHFSet->Get(ATTR_PAGE_ON)).GetValue();
641cdf0e10cSrcweir 		rParam.bDynamic	= ((const SfxBoolItem&) pHFSet->Get(ATTR_PAGE_DYNAMIC)).GetValue();
642cdf0e10cSrcweir 		rParam.bShared	= ((const SfxBoolItem&) pHFSet->Get(ATTR_PAGE_SHARED)).GetValue();
643cdf0e10cSrcweir 		rParam.nHeight	= ((const SvxSizeItem&) pHFSet->Get(ATTR_PAGE_SIZE)).GetSize().Height();
644cdf0e10cSrcweir 		const SvxLRSpaceItem* pHFLR = &(const SvxLRSpaceItem&) pHFSet->Get(ATTR_LRSPACE);
645cdf0e10cSrcweir 		long nTmp;
646cdf0e10cSrcweir 		nTmp = pHFLR->GetLeft();
647cdf0e10cSrcweir 		rParam.nLeft = nTmp < 0 ? 0 : sal_uInt16(nTmp);
648cdf0e10cSrcweir 		nTmp = pHFLR->GetRight();
649cdf0e10cSrcweir 		rParam.nRight = nTmp < 0 ? 0 : sal_uInt16(nTmp);
650cdf0e10cSrcweir 		rParam.pBorder	= (const SvxBoxItem*)   &pHFSet->Get(ATTR_BORDER);
651cdf0e10cSrcweir 		rParam.pBack	= (const SvxBrushItem*) &pHFSet->Get(ATTR_BACKGROUND);
652cdf0e10cSrcweir 		rParam.pShadow	= (const SvxShadowItem*)&pHFSet->Get(ATTR_SHADOW);;
653cdf0e10cSrcweir 
654cdf0e10cSrcweir //	jetzt doch wieder schon im Dialog:
655cdf0e10cSrcweir //		rParam.nHeight += rParam.nDistance;				// nicht mehr im Dialog ???
656cdf0e10cSrcweir 
657cdf0e10cSrcweir 		if (rParam.pBorder)
658cdf0e10cSrcweir 			rParam.nHeight += lcl_LineTotal( rParam.pBorder->GetTop() ) +
659cdf0e10cSrcweir 							  lcl_LineTotal( rParam.pBorder->GetBottom() );
660cdf0e10cSrcweir 
661cdf0e10cSrcweir 		rParam.nManHeight = rParam.nHeight;
662cdf0e10cSrcweir 	}
663cdf0e10cSrcweir 
664cdf0e10cSrcweir 	if (!rParam.bEnable)
665cdf0e10cSrcweir 		rParam.nHeight = 0;
666cdf0e10cSrcweir }
667cdf0e10cSrcweir 
668cdf0e10cSrcweir //	bNew = TRUE:	benutzten Bereich aus dem Dokument suchen
669cdf0e10cSrcweir //	bNew = FALSE:	nur ganze Zeilen/Spalten begrenzen
670cdf0e10cSrcweir 
AdjustPrintArea(sal_Bool bNew)671cdf0e10cSrcweir sal_Bool ScPrintFunc::AdjustPrintArea( sal_Bool bNew )
672cdf0e10cSrcweir {
673cdf0e10cSrcweir 	SCCOL nOldEndCol = nEndCol;	// nur wichtig bei !bNew
674cdf0e10cSrcweir 	SCROW nOldEndRow = nEndRow;
675cdf0e10cSrcweir 	sal_Bool bChangeCol = sal_True;			// bei bNew werden beide angepasst
676cdf0e10cSrcweir 	sal_Bool bChangeRow = sal_True;
677cdf0e10cSrcweir 
678cdf0e10cSrcweir 	sal_Bool bNotes = aTableParam.bNotes;
679cdf0e10cSrcweir 	if ( bNew )
680cdf0e10cSrcweir 	{
681cdf0e10cSrcweir 		nStartCol = 0;
682cdf0e10cSrcweir 		nStartRow = 0;
683cdf0e10cSrcweir 		if (!pDoc->GetPrintArea( nPrintTab, nEndCol, nEndRow, bNotes ))
684cdf0e10cSrcweir 			return sal_False;	// nix
685cdf0e10cSrcweir 	}
686cdf0e10cSrcweir 	else
687cdf0e10cSrcweir 	{
688cdf0e10cSrcweir 		sal_Bool bFound = sal_True;
689cdf0e10cSrcweir 		bChangeCol = ( nStartCol == 0 && nEndCol == MAXCOL );
690cdf0e10cSrcweir 		bChangeRow = ( nStartRow == 0 && nEndRow == MAXROW );
691cdf0e10cSrcweir         sal_Bool bForcedChangeRow = sal_False;
692cdf0e10cSrcweir 
693cdf0e10cSrcweir         // #i53558# Crop entire column of old row limit to real print area with
694cdf0e10cSrcweir         // some fuzzyness.
695cdf0e10cSrcweir         if (!bChangeRow && nStartRow == 0)
696cdf0e10cSrcweir         {
697cdf0e10cSrcweir             SCROW nPAEndRow;
698cdf0e10cSrcweir             bFound = pDoc->GetPrintAreaVer( nPrintTab, nStartCol, nEndCol, nPAEndRow, bNotes );
699cdf0e10cSrcweir             // Say we don't want to print more than ~1000 empty rows, which are
700cdf0e10cSrcweir             // about 14 pages intentionally left blank..
701cdf0e10cSrcweir             const SCROW nFuzzy = 23*42;
702cdf0e10cSrcweir             if (nPAEndRow + nFuzzy < nEndRow)
703cdf0e10cSrcweir             {
704cdf0e10cSrcweir                 bForcedChangeRow = sal_True;
705cdf0e10cSrcweir                 nEndRow = nPAEndRow;
706cdf0e10cSrcweir             }
707cdf0e10cSrcweir             else
708cdf0e10cSrcweir                 bFound = sal_True;  // user seems to _want_ to print some empty rows
709cdf0e10cSrcweir         }
710cdf0e10cSrcweir         // TODO: in case we extend the number of columns we may have to do the
711cdf0e10cSrcweir         // same for horizontal cropping.
712cdf0e10cSrcweir 
713cdf0e10cSrcweir 		if ( bChangeCol && bChangeRow )
714cdf0e10cSrcweir 			bFound = pDoc->GetPrintArea( nPrintTab, nEndCol, nEndRow, bNotes );
715cdf0e10cSrcweir 		else if ( bChangeCol )
716cdf0e10cSrcweir 			bFound = pDoc->GetPrintAreaHor( nPrintTab, nStartRow, nEndRow, nEndCol, bNotes );
717cdf0e10cSrcweir 		else if ( bChangeRow )
718cdf0e10cSrcweir 			bFound = pDoc->GetPrintAreaVer( nPrintTab, nStartCol, nEndCol, nEndRow, bNotes );
719cdf0e10cSrcweir 
720cdf0e10cSrcweir 		if (!bFound)
721cdf0e10cSrcweir 			return sal_False;	// leer
722cdf0e10cSrcweir 
723cdf0e10cSrcweir         if (bForcedChangeRow)
724cdf0e10cSrcweir             bChangeRow = sal_True;
725cdf0e10cSrcweir 	}
726cdf0e10cSrcweir 
727cdf0e10cSrcweir 	pDoc->ExtendMerge( nStartCol,nStartRow, nEndCol,nEndRow, nPrintTab,
728cdf0e10cSrcweir 						sal_False, sal_True );		// kein Refresh, incl. Attrs
729cdf0e10cSrcweir 
730cdf0e10cSrcweir 	if ( bChangeCol )
731cdf0e10cSrcweir 	{
732cdf0e10cSrcweir 		OutputDevice* pRefDev = pDoc->GetPrinter();		// auch fuer Preview den Drucker nehmen
733cdf0e10cSrcweir 		pRefDev->SetMapMode( MAP_PIXEL );				// wichtig fuer GetNeededSize
734cdf0e10cSrcweir 
735cdf0e10cSrcweir 		pDoc->ExtendPrintArea( pRefDev,
736cdf0e10cSrcweir 							nPrintTab, nStartCol, nStartRow, nEndCol, nEndRow );
737cdf0e10cSrcweir 		//	nEndCol wird veraendert
738cdf0e10cSrcweir 	}
739cdf0e10cSrcweir 
740cdf0e10cSrcweir 	if ( nEndCol < MAXCOL && pDoc->HasAttrib(
741cdf0e10cSrcweir 					nEndCol,nStartRow,nPrintTab, nEndCol,nEndRow,nPrintTab, HASATTR_SHADOW_RIGHT ) )
742cdf0e10cSrcweir 		++nEndCol;
743cdf0e10cSrcweir 	if ( nEndRow < MAXROW && pDoc->HasAttrib(
744cdf0e10cSrcweir 					nStartCol,nEndRow,nPrintTab, nEndCol,nEndRow,nPrintTab, HASATTR_SHADOW_DOWN ) )
745cdf0e10cSrcweir 		++nEndRow;
746cdf0e10cSrcweir 
747cdf0e10cSrcweir 	if (!bChangeCol) nEndCol = nOldEndCol;
748cdf0e10cSrcweir 	if (!bChangeRow) nEndRow = nOldEndRow;
749cdf0e10cSrcweir 
750cdf0e10cSrcweir 	return sal_True;
751cdf0e10cSrcweir }
752cdf0e10cSrcweir 
TextHeight(const EditTextObject * pObject)753cdf0e10cSrcweir long ScPrintFunc::TextHeight( const EditTextObject* pObject )
754cdf0e10cSrcweir {
755cdf0e10cSrcweir 	if (!pObject)
756cdf0e10cSrcweir 		return 0;
757cdf0e10cSrcweir 
758cdf0e10cSrcweir //	pEditEngine->SetPageNo( nTotalPages );
759cdf0e10cSrcweir 	pEditEngine->SetTextNewDefaults( *pObject, *pEditDefaults, sal_False );
760cdf0e10cSrcweir 
761cdf0e10cSrcweir 	return (long) pEditEngine->GetTextHeight();
762cdf0e10cSrcweir }
763cdf0e10cSrcweir 
764cdf0e10cSrcweir //	nZoom muss gesetzt sein !!!
765cdf0e10cSrcweir //	und der entsprechende Twip-MapMode eingestellt
766cdf0e10cSrcweir 
UpdateHFHeight(ScPrintHFParam & rParam)767cdf0e10cSrcweir void ScPrintFunc::UpdateHFHeight( ScPrintHFParam& rParam )
768cdf0e10cSrcweir {
769cdf0e10cSrcweir 	DBG_ASSERT( aPageSize.Width(), "UpdateHFHeight ohne aPageSize");
770cdf0e10cSrcweir 
771cdf0e10cSrcweir 	if (rParam.bEnable && rParam.bDynamic)
772cdf0e10cSrcweir 	{
773cdf0e10cSrcweir 		//	nHeight aus Inhalten berechnen
774cdf0e10cSrcweir 
775cdf0e10cSrcweir 		MakeEditEngine();
776cdf0e10cSrcweir 		long nPaperWidth = ( aPageSize.Width() - nLeftMargin - nRightMargin -
777cdf0e10cSrcweir 								rParam.nLeft - rParam.nRight ) * 100 / nZoom;
778cdf0e10cSrcweir 		if (rParam.pBorder)
779cdf0e10cSrcweir 			nPaperWidth -= ( rParam.pBorder->GetDistance(BOX_LINE_LEFT) +
780cdf0e10cSrcweir 							 rParam.pBorder->GetDistance(BOX_LINE_RIGHT) +
781cdf0e10cSrcweir 							 lcl_LineTotal(rParam.pBorder->GetLeft()) +
782cdf0e10cSrcweir 							 lcl_LineTotal(rParam.pBorder->GetRight()) ) * 100 / nZoom;
783cdf0e10cSrcweir 
784cdf0e10cSrcweir 		if (rParam.pShadow && rParam.pShadow->GetLocation() != SVX_SHADOW_NONE)
785cdf0e10cSrcweir 			nPaperWidth -= ( rParam.pShadow->CalcShadowSpace(SHADOW_LEFT) +
786cdf0e10cSrcweir 							 rParam.pShadow->CalcShadowSpace(SHADOW_RIGHT) ) * 100L / nZoom;
787cdf0e10cSrcweir 
788cdf0e10cSrcweir 		pEditEngine->SetPaperSize( Size( nPaperWidth, 10000 ) );
789cdf0e10cSrcweir 
790cdf0e10cSrcweir 		long nMaxHeight = 0;
791cdf0e10cSrcweir 		if ( rParam.pLeft )
792cdf0e10cSrcweir 		{
793cdf0e10cSrcweir 			nMaxHeight = Max( nMaxHeight, TextHeight( rParam.pLeft->GetLeftArea() ) );
794cdf0e10cSrcweir 			nMaxHeight = Max( nMaxHeight, TextHeight( rParam.pLeft->GetCenterArea() ) );
795cdf0e10cSrcweir 			nMaxHeight = Max( nMaxHeight, TextHeight( rParam.pLeft->GetRightArea() ) );
796cdf0e10cSrcweir 		}
797cdf0e10cSrcweir 		if ( rParam.pRight )
798cdf0e10cSrcweir 		{
799cdf0e10cSrcweir 			nMaxHeight = Max( nMaxHeight, TextHeight( rParam.pRight->GetLeftArea() ) );
800cdf0e10cSrcweir 			nMaxHeight = Max( nMaxHeight, TextHeight( rParam.pRight->GetCenterArea() ) );
801cdf0e10cSrcweir 			nMaxHeight = Max( nMaxHeight, TextHeight( rParam.pRight->GetRightArea() ) );
802cdf0e10cSrcweir 		}
803cdf0e10cSrcweir 
804cdf0e10cSrcweir 		rParam.nHeight = nMaxHeight + rParam.nDistance;
805cdf0e10cSrcweir 		if (rParam.pBorder)
806cdf0e10cSrcweir 			rParam.nHeight += rParam.pBorder->GetDistance(BOX_LINE_TOP) +
807cdf0e10cSrcweir 							  rParam.pBorder->GetDistance(BOX_LINE_BOTTOM) +
808cdf0e10cSrcweir 							  lcl_LineTotal( rParam.pBorder->GetTop() ) +
809cdf0e10cSrcweir 							  lcl_LineTotal( rParam.pBorder->GetBottom() );
810cdf0e10cSrcweir 		if (rParam.pShadow && rParam.pShadow->GetLocation() != SVX_SHADOW_NONE)
811cdf0e10cSrcweir 			rParam.nHeight += rParam.pShadow->CalcShadowSpace(SHADOW_TOP) +
812cdf0e10cSrcweir 							  rParam.pShadow->CalcShadowSpace(SHADOW_BOTTOM);
813cdf0e10cSrcweir 
814cdf0e10cSrcweir 		if (rParam.nHeight < rParam.nManHeight)
815cdf0e10cSrcweir 			rParam.nHeight = rParam.nManHeight;			// eingestelltes Minimum
816cdf0e10cSrcweir 	}
817cdf0e10cSrcweir }
818cdf0e10cSrcweir 
InitParam(const ScPrintOptions * pOptions)819cdf0e10cSrcweir void ScPrintFunc::InitParam( const ScPrintOptions* pOptions )
820cdf0e10cSrcweir {
821cdf0e10cSrcweir 	if (!pParamSet)
822cdf0e10cSrcweir 		return;
823cdf0e10cSrcweir 
824cdf0e10cSrcweir 								// TabPage "Seite"
825cdf0e10cSrcweir 	const SvxLRSpaceItem* pLRItem = (const SvxLRSpaceItem*) &pParamSet->Get( ATTR_LRSPACE );
826cdf0e10cSrcweir 	long nTmp;
827cdf0e10cSrcweir 	nTmp = pLRItem->GetLeft();
828cdf0e10cSrcweir 	nLeftMargin = nTmp < 0 ? 0 : sal_uInt16(nTmp);
829cdf0e10cSrcweir 	nTmp = pLRItem->GetRight();
830cdf0e10cSrcweir 	nRightMargin = nTmp < 0 ? 0 : sal_uInt16(nTmp);
831cdf0e10cSrcweir 	const SvxULSpaceItem* pULItem = (const SvxULSpaceItem*) &pParamSet->Get( ATTR_ULSPACE );
832cdf0e10cSrcweir 	nTopMargin    = pULItem->GetUpper();
833cdf0e10cSrcweir 	nBottomMargin = pULItem->GetLower();
834cdf0e10cSrcweir 
835cdf0e10cSrcweir 	const SvxPageItem* pPageItem = (const SvxPageItem*) &pParamSet->Get( ATTR_PAGE );
836cdf0e10cSrcweir 	nPageUsage			= pPageItem->GetPageUsage();
837cdf0e10cSrcweir 	bLandscape			= pPageItem->IsLandscape();
838cdf0e10cSrcweir 	aFieldData.eNumType	= pPageItem->GetNumType();
839cdf0e10cSrcweir 
840cdf0e10cSrcweir 	bCenterHor = ((const SfxBoolItem&) pParamSet->Get(ATTR_PAGE_HORCENTER)).GetValue();
841cdf0e10cSrcweir 	bCenterVer = ((const SfxBoolItem&) pParamSet->Get(ATTR_PAGE_VERCENTER)).GetValue();
842cdf0e10cSrcweir 
843cdf0e10cSrcweir 	aPageSize = ((const SvxSizeItem&) pParamSet->Get(ATTR_PAGE_SIZE)).GetSize();
844cdf0e10cSrcweir 	if ( !aPageSize.Width() || !aPageSize.Height() )
845cdf0e10cSrcweir 	{
846cdf0e10cSrcweir 		DBG_ERROR("PageSize Null ?!?!?");
847cdf0e10cSrcweir 		aPageSize = SvxPaperInfo::GetPaperSize( PAPER_A4 );
848cdf0e10cSrcweir 	}
849cdf0e10cSrcweir 
850cdf0e10cSrcweir 	pBorderItem		= (const SvxBoxItem*)    &pParamSet->Get(ATTR_BORDER);
851cdf0e10cSrcweir 	pBackgroundItem	= (const SvxBrushItem*)	 &pParamSet->Get(ATTR_BACKGROUND);
852cdf0e10cSrcweir 	pShadowItem		= (const SvxShadowItem*) &pParamSet->Get(ATTR_SHADOW);
853cdf0e10cSrcweir 
854cdf0e10cSrcweir 								// TabPage "Kopfzeile"
855cdf0e10cSrcweir 
856cdf0e10cSrcweir 	aHdr.pLeft		= (const ScPageHFItem*)	&pParamSet->Get(ATTR_PAGE_HEADERLEFT);		// Inhalt
857cdf0e10cSrcweir 	aHdr.pRight		= (const ScPageHFItem*)	&pParamSet->Get(ATTR_PAGE_HEADERRIGHT);
858cdf0e10cSrcweir 
859cdf0e10cSrcweir 	const SvxSetItem* pHeaderSetItem;
860cdf0e10cSrcweir 	const SfxItemSet* pHeaderSet = NULL;
861cdf0e10cSrcweir 	if ( pParamSet->GetItemState( ATTR_PAGE_HEADERSET, sal_False,
862cdf0e10cSrcweir 							(const SfxPoolItem**)&pHeaderSetItem ) == SFX_ITEM_SET )
863cdf0e10cSrcweir 	{
864cdf0e10cSrcweir 		pHeaderSet = &pHeaderSetItem->GetItemSet();
865cdf0e10cSrcweir 														// Kopfzeile hat unteren Abstand
866cdf0e10cSrcweir 		aHdr.nDistance	= ((const SvxULSpaceItem&) pHeaderSet->Get(ATTR_ULSPACE)).GetLower();
867cdf0e10cSrcweir 	}
868cdf0e10cSrcweir 	lcl_FillHFParam( aHdr, pHeaderSet );
869cdf0e10cSrcweir 
870cdf0e10cSrcweir 								// TabPage "Fusszeile"
871cdf0e10cSrcweir 
872cdf0e10cSrcweir 	aFtr.pLeft		= (const ScPageHFItem*)	&pParamSet->Get(ATTR_PAGE_FOOTERLEFT);		// Inhalt
873cdf0e10cSrcweir 	aFtr.pRight		= (const ScPageHFItem*)	&pParamSet->Get(ATTR_PAGE_FOOTERRIGHT);
874cdf0e10cSrcweir 
875cdf0e10cSrcweir 	const SvxSetItem* pFooterSetItem;
876cdf0e10cSrcweir 	const SfxItemSet* pFooterSet = NULL;
877cdf0e10cSrcweir 	if ( pParamSet->GetItemState( ATTR_PAGE_FOOTERSET, sal_False,
878cdf0e10cSrcweir 							(const SfxPoolItem**)&pFooterSetItem ) == SFX_ITEM_SET )
879cdf0e10cSrcweir 	{
880cdf0e10cSrcweir 		pFooterSet = &pFooterSetItem->GetItemSet();
881cdf0e10cSrcweir 														// Fusszeile hat oberen Abstand
882cdf0e10cSrcweir 		aFtr.nDistance	= ((const SvxULSpaceItem&) pFooterSet->Get(ATTR_ULSPACE)).GetUpper();
883cdf0e10cSrcweir 	}
884cdf0e10cSrcweir 	lcl_FillHFParam( aFtr, pFooterSet );
885cdf0e10cSrcweir 
886cdf0e10cSrcweir 	//------------------------------------------------------
887cdf0e10cSrcweir 	// Table-/Area-Params aus einzelnen Items zusammenbauen:
888cdf0e10cSrcweir 	//------------------------------------------------------
889cdf0e10cSrcweir 	// TabPage "Tabelle"
890cdf0e10cSrcweir 
891cdf0e10cSrcweir     const SfxUInt16Item*     pScaleItem          = NULL;
892cdf0e10cSrcweir     const ScPageScaleToItem* pScaleToItem        = NULL;
893cdf0e10cSrcweir     const SfxUInt16Item*     pScaleToPagesItem   = NULL;
894cdf0e10cSrcweir     SfxItemState             eState;
895cdf0e10cSrcweir 
896cdf0e10cSrcweir 	eState = pParamSet->GetItemState( ATTR_PAGE_SCALE, sal_False,
897cdf0e10cSrcweir 									  (const SfxPoolItem**)&pScaleItem );
898cdf0e10cSrcweir 	if ( SFX_ITEM_DEFAULT == eState )
899cdf0e10cSrcweir 		pScaleItem = (const SfxUInt16Item*)
900cdf0e10cSrcweir                     &pParamSet->GetPool()->GetDefaultItem( ATTR_PAGE_SCALE );
901cdf0e10cSrcweir 
902cdf0e10cSrcweir     eState = pParamSet->GetItemState( ATTR_PAGE_SCALETO, sal_False,
903cdf0e10cSrcweir                                       (const SfxPoolItem**)&pScaleToItem );
904cdf0e10cSrcweir     if ( SFX_ITEM_DEFAULT == eState )
905cdf0e10cSrcweir         pScaleToItem = (const ScPageScaleToItem*)
906cdf0e10cSrcweir                     &pParamSet->GetPool()->GetDefaultItem( ATTR_PAGE_SCALETO );
907cdf0e10cSrcweir 
908cdf0e10cSrcweir 	eState = pParamSet->GetItemState( ATTR_PAGE_SCALETOPAGES, sal_False,
909cdf0e10cSrcweir 									  (const SfxPoolItem**)&pScaleToPagesItem );
910cdf0e10cSrcweir 	if ( SFX_ITEM_DEFAULT == eState )
911cdf0e10cSrcweir 		pScaleToPagesItem = (const SfxUInt16Item*)
912cdf0e10cSrcweir                     &pParamSet->GetPool()->GetDefaultItem( ATTR_PAGE_SCALETOPAGES );
913cdf0e10cSrcweir 
914cdf0e10cSrcweir     DBG_ASSERT( pScaleItem && pScaleToItem && pScaleToPagesItem, "Missing ScaleItem! :-/" );
915cdf0e10cSrcweir 
916cdf0e10cSrcweir     aTableParam.bCellContent    = sal_True;
917cdf0e10cSrcweir 	aTableParam.bNotes			= GET_BOOL(pParamSet,ATTR_PAGE_NOTES);
918cdf0e10cSrcweir 	aTableParam.bGrid			= GET_BOOL(pParamSet,ATTR_PAGE_GRID);
919cdf0e10cSrcweir 	aTableParam.bHeaders		= GET_BOOL(pParamSet,ATTR_PAGE_HEADERS);
920cdf0e10cSrcweir 	aTableParam.bFormulas		= GET_BOOL(pParamSet,ATTR_PAGE_FORMULAS);
921cdf0e10cSrcweir 	aTableParam.bNullVals		= GET_BOOL(pParamSet,ATTR_PAGE_NULLVALS);
922cdf0e10cSrcweir 	aTableParam.bCharts			= GET_SHOW(pParamSet,ATTR_PAGE_CHARTS);
923cdf0e10cSrcweir 	aTableParam.bObjects		= GET_SHOW(pParamSet,ATTR_PAGE_OBJECTS);
924cdf0e10cSrcweir 	aTableParam.bDrawings		= GET_SHOW(pParamSet,ATTR_PAGE_DRAWINGS);
925cdf0e10cSrcweir 	aTableParam.bTopDown		= GET_BOOL(pParamSet,ATTR_PAGE_TOPDOWN);
926cdf0e10cSrcweir 	aTableParam.bLeftRight		= !aTableParam.bLeftRight;
927cdf0e10cSrcweir 	aTableParam.nFirstPageNo	= GET_USHORT(pParamSet,ATTR_PAGE_FIRSTPAGENO);
928cdf0e10cSrcweir 	if (!aTableParam.nFirstPageNo)
929cdf0e10cSrcweir 		aTableParam.nFirstPageNo = (sal_uInt16) nPageStart;		// von vorheriger Tabelle
930cdf0e10cSrcweir 
931cdf0e10cSrcweir     if ( pScaleItem && pScaleToItem && pScaleToPagesItem )
932cdf0e10cSrcweir 	{
933cdf0e10cSrcweir 		sal_uInt16	nScaleAll     = pScaleItem->GetValue();
934cdf0e10cSrcweir 		sal_uInt16	nScaleToPages = pScaleToPagesItem->GetValue();
935cdf0e10cSrcweir 
936cdf0e10cSrcweir 		aTableParam.bScaleNone		= (nScaleAll     == 100);
937cdf0e10cSrcweir 		aTableParam.bScaleAll		= (nScaleAll      > 0  );
938cdf0e10cSrcweir         aTableParam.bScaleTo        = pScaleToItem->IsValid();
939cdf0e10cSrcweir 		aTableParam.bScalePageNum	= (nScaleToPages  > 0  );
940cdf0e10cSrcweir 		aTableParam.nScaleAll		= nScaleAll;
941cdf0e10cSrcweir         aTableParam.nScaleWidth     = pScaleToItem->GetWidth();
942cdf0e10cSrcweir         aTableParam.nScaleHeight    = pScaleToItem->GetHeight();
943cdf0e10cSrcweir 		aTableParam.nScalePageNum	= nScaleToPages;
944cdf0e10cSrcweir 	}
945cdf0e10cSrcweir 	else
946cdf0e10cSrcweir 	{
947cdf0e10cSrcweir 		aTableParam.bScaleNone		= sal_True;
948cdf0e10cSrcweir 		aTableParam.bScaleAll		= sal_False;
949cdf0e10cSrcweir         aTableParam.bScaleTo        = sal_False;
950cdf0e10cSrcweir 		aTableParam.bScalePageNum	= sal_False;
951cdf0e10cSrcweir 		aTableParam.nScaleAll		= 0;
952cdf0e10cSrcweir         aTableParam.nScaleWidth     = 0;
953cdf0e10cSrcweir         aTableParam.nScaleHeight    = 0;
954cdf0e10cSrcweir 		aTableParam.nScalePageNum	= 0;
955cdf0e10cSrcweir 	}
956cdf0e10cSrcweir 
957cdf0e10cSrcweir 	//	skip empty pages only if options with that flag are passed
958cdf0e10cSrcweir 	aTableParam.bSkipEmpty = pOptions && pOptions->GetSkipEmpty();
959cdf0e10cSrcweir 	if ( pPageData )
960cdf0e10cSrcweir 		aTableParam.bSkipEmpty = sal_False;
961cdf0e10cSrcweir 	// Wenn pPageData gesetzt ist, interessieren fuer die Umbruch-Vorschau
962cdf0e10cSrcweir 	// nur die Umbrueche, leere Seiten werden nicht speziell behandelt
963cdf0e10cSrcweir 
964cdf0e10cSrcweir 	//------------------------------------------------------
965cdf0e10cSrcweir 	// TabPage "Bereiche":
966cdf0e10cSrcweir 	//------------------------------------------------------
967cdf0e10cSrcweir 
968cdf0e10cSrcweir 	//!	alle PrintAreas der Tabelle durchgehen !!!
969cdf0e10cSrcweir 	const ScRange*	pPrintArea = pDoc->GetPrintRange( nPrintTab, 0 );
970cdf0e10cSrcweir 	const ScRange*	pRepeatCol = pDoc->GetRepeatColRange( nPrintTab );
971cdf0e10cSrcweir 	const ScRange*	pRepeatRow = pDoc->GetRepeatRowRange( nPrintTab );
972cdf0e10cSrcweir 
973cdf0e10cSrcweir 	//	ATTR_PAGE_PRINTTABLES wird ignoriert
974cdf0e10cSrcweir 
975cdf0e10cSrcweir 	if ( pUserArea )				// UserArea (Selektion) hat Vorrang
976cdf0e10cSrcweir 	{
977cdf0e10cSrcweir 		bPrintCurrentTable    =
978cdf0e10cSrcweir 		aAreaParam.bPrintArea = sal_True;					// Selektion
979cdf0e10cSrcweir 		aAreaParam.aPrintArea = *pUserArea;
980cdf0e10cSrcweir 
981cdf0e10cSrcweir 		//	Die Tabellen-Abfrage ist schon in DocShell::Print, hier immer
982cdf0e10cSrcweir 		aAreaParam.aPrintArea.aStart.SetTab(nPrintTab);
983cdf0e10cSrcweir 		aAreaParam.aPrintArea.aEnd.SetTab(nPrintTab);
984cdf0e10cSrcweir 
985cdf0e10cSrcweir //		lcl_LimitRange( aAreaParam.aPrintArea, nPrintTab );			// ganze Zeilen/Spalten...
986cdf0e10cSrcweir 	}
987cdf0e10cSrcweir 	else if ( pDoc->HasPrintRange() )
988cdf0e10cSrcweir 	{
989cdf0e10cSrcweir 		if ( pPrintArea )								// mindestens eine gesetzt ?
990cdf0e10cSrcweir 		{
991cdf0e10cSrcweir 			bPrintCurrentTable    =
992cdf0e10cSrcweir 			aAreaParam.bPrintArea = sal_True;
993cdf0e10cSrcweir 			aAreaParam.aPrintArea = *pPrintArea;
994cdf0e10cSrcweir 
995cdf0e10cSrcweir 			bMultiArea = ( pDoc->GetPrintRangeCount(nPrintTab) > 1 );
996cdf0e10cSrcweir 		}
997cdf0e10cSrcweir 		else
998cdf0e10cSrcweir 		{
999cdf0e10cSrcweir             // do not print hidden sheets with "Print entire sheet" flag
1000cdf0e10cSrcweir             bPrintCurrentTable = pDoc->IsPrintEntireSheet( nPrintTab ) && pDoc->IsVisible( nPrintTab );
1001cdf0e10cSrcweir             aAreaParam.bPrintArea = !bPrintCurrentTable;    // otherwise the table is always counted
1002cdf0e10cSrcweir 		}
1003cdf0e10cSrcweir 	}
1004cdf0e10cSrcweir 	else
1005cdf0e10cSrcweir 	{
1006cdf0e10cSrcweir 		//	#74834# don't print hidden tables if there's no print range defined there
1007cdf0e10cSrcweir 		if ( pDoc->IsVisible( nPrintTab ) )
1008cdf0e10cSrcweir 		{
1009cdf0e10cSrcweir 			aAreaParam.bPrintArea = sal_False;
1010cdf0e10cSrcweir 			bPrintCurrentTable = sal_True;
1011cdf0e10cSrcweir 		}
1012cdf0e10cSrcweir 		else
1013cdf0e10cSrcweir 		{
1014cdf0e10cSrcweir 			aAreaParam.bPrintArea = sal_True;	// otherwise the table is always counted
1015cdf0e10cSrcweir 			bPrintCurrentTable = sal_False;
1016cdf0e10cSrcweir 		}
1017cdf0e10cSrcweir 	}
1018cdf0e10cSrcweir 
1019cdf0e10cSrcweir 	if ( pRepeatCol )
1020cdf0e10cSrcweir 	{
1021cdf0e10cSrcweir 		aAreaParam.bRepeatCol = sal_True;
1022cdf0e10cSrcweir 		aAreaParam.aRepeatCol = *pRepeatCol;
1023cdf0e10cSrcweir 		nRepeatStartCol	= pRepeatCol->aStart.Col();
1024cdf0e10cSrcweir 		nRepeatEndCol	= pRepeatCol->aEnd  .Col();
1025cdf0e10cSrcweir 	}
1026cdf0e10cSrcweir 	else
1027cdf0e10cSrcweir 	{
1028cdf0e10cSrcweir 		aAreaParam.bRepeatCol = sal_False;
1029cdf0e10cSrcweir 		nRepeatStartCol = nRepeatEndCol = SCCOL_REPEAT_NONE;
1030cdf0e10cSrcweir 	}
1031cdf0e10cSrcweir 
1032cdf0e10cSrcweir 	if ( pRepeatRow )
1033cdf0e10cSrcweir 	{
1034cdf0e10cSrcweir 		aAreaParam.bRepeatRow = sal_True;
1035cdf0e10cSrcweir 		aAreaParam.aRepeatRow = *pRepeatRow;
1036cdf0e10cSrcweir 		nRepeatStartRow	= pRepeatRow->aStart.Row();
1037cdf0e10cSrcweir 		nRepeatEndRow	= pRepeatRow->aEnd  .Row();
1038cdf0e10cSrcweir 	}
1039cdf0e10cSrcweir 	else
1040cdf0e10cSrcweir 	{
1041cdf0e10cSrcweir 		aAreaParam.bRepeatRow = sal_False;
1042cdf0e10cSrcweir 		nRepeatStartRow = nRepeatEndRow = SCROW_REPEAT_NONE;
1043cdf0e10cSrcweir 	}
1044cdf0e10cSrcweir 
1045cdf0e10cSrcweir 			//
1046cdf0e10cSrcweir 			//	Seiten aufteilen
1047cdf0e10cSrcweir 			//
1048cdf0e10cSrcweir 
1049cdf0e10cSrcweir 	if (!bState)
1050cdf0e10cSrcweir 	{
1051cdf0e10cSrcweir 		nTabPages = CountPages();									// berechnet auch Zoom
1052cdf0e10cSrcweir 		nTotalPages = nTabPages;
1053cdf0e10cSrcweir 		nTotalPages += CountNotePages();
1054cdf0e10cSrcweir 	}
1055cdf0e10cSrcweir 	else
1056cdf0e10cSrcweir 	{
1057cdf0e10cSrcweir 		CalcPages();			// nur Umbrueche suchen
1058cdf0e10cSrcweir 		CountNotePages();		// Notizen zaehlen, auch wenn Seitenzahl schon bekannt
1059cdf0e10cSrcweir 	}
1060cdf0e10cSrcweir 
1061cdf0e10cSrcweir 	if (nDocPages)
1062cdf0e10cSrcweir 		aFieldData.nTotalPages = nDocPages;
1063cdf0e10cSrcweir 	else
1064cdf0e10cSrcweir 		aFieldData.nTotalPages = nTotalPages;
1065cdf0e10cSrcweir 
1066cdf0e10cSrcweir 	SetDateTime( Date(), Time() );
1067cdf0e10cSrcweir 
1068cdf0e10cSrcweir 	aFieldData.aTitle		= pDocShell->GetTitle();
1069cdf0e10cSrcweir 	const INetURLObject& rURLObj = pDocShell->GetMedium()->GetURLObject();
1070cdf0e10cSrcweir 	aFieldData.aLongDocName	= rURLObj.GetMainURL( INetURLObject::DECODE_UNAMBIGUOUS );
1071cdf0e10cSrcweir 	if ( aFieldData.aLongDocName.Len() )
1072cdf0e10cSrcweir 		aFieldData.aShortDocName = rURLObj.GetName( INetURLObject::DECODE_UNAMBIGUOUS );
1073cdf0e10cSrcweir 	else
1074cdf0e10cSrcweir 		aFieldData.aShortDocName = aFieldData.aLongDocName = aFieldData.aTitle;
1075cdf0e10cSrcweir 
1076cdf0e10cSrcweir 	//	Druckereinstellungen (Orientation, Paper) jetzt erst bei DoPrint
1077cdf0e10cSrcweir }
1078cdf0e10cSrcweir 
GetDataSize() const1079cdf0e10cSrcweir Size ScPrintFunc::GetDataSize() const
1080cdf0e10cSrcweir {
1081cdf0e10cSrcweir 	Size aSize = aPageSize;
1082cdf0e10cSrcweir 	aSize.Width()  -= nLeftMargin + nRightMargin;
1083cdf0e10cSrcweir 	aSize.Height() -= nTopMargin + nBottomMargin;
1084cdf0e10cSrcweir 	aSize.Height() -= aHdr.nHeight + aFtr.nHeight;
1085cdf0e10cSrcweir 	return aSize;
1086cdf0e10cSrcweir }
1087cdf0e10cSrcweir 
GetScaleData(Size & rPhysSize,long & rDocHdr,long & rDocFtr)1088cdf0e10cSrcweir void ScPrintFunc::GetScaleData( Size& rPhysSize, long& rDocHdr, long& rDocFtr )
1089cdf0e10cSrcweir {
1090cdf0e10cSrcweir 	rPhysSize = aPageSize;
1091cdf0e10cSrcweir 	rPhysSize.Width()  -= nLeftMargin + nRightMargin;
1092cdf0e10cSrcweir 	rPhysSize.Height() -= nTopMargin + nBottomMargin;
1093cdf0e10cSrcweir 
1094cdf0e10cSrcweir 	rDocHdr = aHdr.nHeight;
1095cdf0e10cSrcweir 	rDocFtr = aFtr.nHeight;
1096cdf0e10cSrcweir }
1097cdf0e10cSrcweir 
SetDateTime(const Date & rDate,const Time & rTime)1098cdf0e10cSrcweir void ScPrintFunc::SetDateTime( const Date& rDate, const Time& rTime )
1099cdf0e10cSrcweir {
1100cdf0e10cSrcweir 	aFieldData.aDate = rDate;
1101cdf0e10cSrcweir 	aFieldData.aTime = rTime;
1102cdf0e10cSrcweir }
1103cdf0e10cSrcweir 
lcl_DrawGraphic(const Graphic & rGraphic,OutputDevice * pOut,const Rectangle & rGrf,const Rectangle & rOut)1104cdf0e10cSrcweir void lcl_DrawGraphic( const Graphic &rGraphic, OutputDevice *pOut,
1105cdf0e10cSrcweir                       const Rectangle &rGrf, const Rectangle &rOut )
1106cdf0e10cSrcweir {
1107cdf0e10cSrcweir     const FASTBOOL bNotInside = !rOut.IsInside( rGrf );
1108cdf0e10cSrcweir     if ( bNotInside )
1109cdf0e10cSrcweir     {
1110cdf0e10cSrcweir         pOut->Push();
1111cdf0e10cSrcweir         pOut->IntersectClipRegion( rOut );
1112cdf0e10cSrcweir     }
1113cdf0e10cSrcweir 
1114cdf0e10cSrcweir     ((Graphic&)rGraphic).Draw( pOut, rGrf.TopLeft(), rGrf.GetSize() );
1115cdf0e10cSrcweir 
1116cdf0e10cSrcweir     if ( bNotInside )
1117cdf0e10cSrcweir         pOut->Pop();
1118cdf0e10cSrcweir }
1119cdf0e10cSrcweir 
lcl_DrawGraphic(const SvxBrushItem & rBrush,OutputDevice * pOut,OutputDevice * pRefDev,const Rectangle & rOrg,const Rectangle & rOut)1120cdf0e10cSrcweir void lcl_DrawGraphic( const SvxBrushItem &rBrush, OutputDevice *pOut, OutputDevice* pRefDev,
1121cdf0e10cSrcweir 						const Rectangle &rOrg, const Rectangle &rOut )
1122cdf0e10cSrcweir {
1123cdf0e10cSrcweir 	Size aGrfSize(0,0);
1124cdf0e10cSrcweir 	const Graphic *pGraphic = rBrush.GetGraphic();
1125cdf0e10cSrcweir 	SvxGraphicPosition ePos;
1126cdf0e10cSrcweir 	if ( pGraphic && pGraphic->IsSupportedGraphic() )
1127cdf0e10cSrcweir 	{
1128cdf0e10cSrcweir 		const MapMode aMapMM( MAP_100TH_MM );
1129cdf0e10cSrcweir 		if ( pGraphic->GetPrefMapMode().GetMapUnit() == MAP_PIXEL )
1130cdf0e10cSrcweir 			aGrfSize = pRefDev->PixelToLogic( pGraphic->GetPrefSize(), aMapMM );
1131cdf0e10cSrcweir 		else
1132cdf0e10cSrcweir 			aGrfSize = OutputDevice::LogicToLogic( pGraphic->GetPrefSize(),
1133cdf0e10cSrcweir 									pGraphic->GetPrefMapMode(), aMapMM );
1134cdf0e10cSrcweir 		ePos = rBrush.GetGraphicPos();
1135cdf0e10cSrcweir 	}
1136cdf0e10cSrcweir 	else
1137cdf0e10cSrcweir 		ePos = GPOS_NONE;
1138cdf0e10cSrcweir 
1139cdf0e10cSrcweir 	Point aPos;
1140cdf0e10cSrcweir 	Size aDrawSize = aGrfSize;
1141cdf0e10cSrcweir 
1142cdf0e10cSrcweir 	FASTBOOL bDraw = sal_True;
1143cdf0e10cSrcweir //	FASTBOOL bRetouche = sal_True;
1144cdf0e10cSrcweir 	switch ( ePos )
1145cdf0e10cSrcweir 	{
1146cdf0e10cSrcweir 		case GPOS_LT: aPos = rOrg.TopLeft();
1147cdf0e10cSrcweir 					  break;
1148cdf0e10cSrcweir 		case GPOS_MT: aPos.Y() = rOrg.Top();
1149cdf0e10cSrcweir 					  aPos.X() = rOrg.Left() + rOrg.GetSize().Width()/2 - aGrfSize.Width()/2;
1150cdf0e10cSrcweir 					  break;
1151cdf0e10cSrcweir 		case GPOS_RT: aPos.Y() = rOrg.Top();
1152cdf0e10cSrcweir 					  aPos.X() = rOrg.Right() - aGrfSize.Width();
1153cdf0e10cSrcweir 					  break;
1154cdf0e10cSrcweir 
1155cdf0e10cSrcweir 		case GPOS_LM: aPos.Y() = rOrg.Top() + rOrg.GetSize().Height()/2 - aGrfSize.Height()/2;
1156cdf0e10cSrcweir 					  aPos.X() = rOrg.Left();
1157cdf0e10cSrcweir 					  break;
1158cdf0e10cSrcweir 		case GPOS_MM: aPos.Y() = rOrg.Top() + rOrg.GetSize().Height()/2 - aGrfSize.Height()/2;
1159cdf0e10cSrcweir 					  aPos.X() = rOrg.Left() + rOrg.GetSize().Width()/2 - aGrfSize.Width()/2;
1160cdf0e10cSrcweir 					  break;
1161cdf0e10cSrcweir 		case GPOS_RM: aPos.Y() = rOrg.Top() + rOrg.GetSize().Height()/2 - aGrfSize.Height()/2;
1162cdf0e10cSrcweir 					  aPos.X() = rOrg.Right() - aGrfSize.Width();
1163cdf0e10cSrcweir 					  break;
1164cdf0e10cSrcweir 
1165cdf0e10cSrcweir 		case GPOS_LB: aPos.Y() = rOrg.Bottom() - aGrfSize.Height();
1166cdf0e10cSrcweir 					  aPos.X() = rOrg.Left();
1167cdf0e10cSrcweir 					  break;
1168cdf0e10cSrcweir 		case GPOS_MB: aPos.Y() = rOrg.Bottom() - aGrfSize.Height();
1169cdf0e10cSrcweir 					  aPos.X() = rOrg.Left() + rOrg.GetSize().Width()/2 - aGrfSize.Width()/2;
1170cdf0e10cSrcweir 					  break;
1171cdf0e10cSrcweir 		case GPOS_RB: aPos.Y() = rOrg.Bottom() - aGrfSize.Height();
1172cdf0e10cSrcweir 					  aPos.X() = rOrg.Right() - aGrfSize.Width();
1173cdf0e10cSrcweir 					  break;
1174cdf0e10cSrcweir 
1175cdf0e10cSrcweir 		case GPOS_AREA:
1176cdf0e10cSrcweir 					  aPos = rOrg.TopLeft();
1177cdf0e10cSrcweir 					  aDrawSize = rOrg.GetSize();
1178cdf0e10cSrcweir //					  bRetouche = sal_False;
1179cdf0e10cSrcweir 					  break;
1180cdf0e10cSrcweir 		case GPOS_TILED:
1181cdf0e10cSrcweir 					{
1182cdf0e10cSrcweir 						//	#104004# use GraphicObject::DrawTiled instead of an own loop
1183cdf0e10cSrcweir 						//	(pixel rounding is handled correctly, and a very small bitmap
1184cdf0e10cSrcweir 						//	is duplicated into a bigger one for better performance)
1185cdf0e10cSrcweir 
1186cdf0e10cSrcweir 						GraphicObject aObject( *pGraphic );
1187cdf0e10cSrcweir 
1188cdf0e10cSrcweir                         if( pOut->GetPDFWriter() &&
1189cdf0e10cSrcweir                             (aObject.GetType() == GRAPHIC_BITMAP || aObject.GetType() == GRAPHIC_DEFAULT) )
1190cdf0e10cSrcweir                         {
1191cdf0e10cSrcweir                             // #104004# For PDF export, every draw
1192cdf0e10cSrcweir                             // operation for bitmaps takes a noticeable
1193cdf0e10cSrcweir                             // amount of place (~50 characters). Thus,
1194cdf0e10cSrcweir                             // optimize between tile bitmap size and
1195cdf0e10cSrcweir                             // number of drawing operations here.
1196cdf0e10cSrcweir                             //
1197cdf0e10cSrcweir                             //                  A_out
1198cdf0e10cSrcweir                             // n_chars = k1 *  ---------- + k2 * A_bitmap
1199cdf0e10cSrcweir                             //                  A_bitmap
1200cdf0e10cSrcweir                             //
1201cdf0e10cSrcweir                             // minimum n_chars is obtained for (derive for
1202cdf0e10cSrcweir                             // A_bitmap, set to 0, take positive
1203cdf0e10cSrcweir                             // solution):
1204cdf0e10cSrcweir                             //                   k1
1205cdf0e10cSrcweir                             // A_bitmap = Sqrt( ---- A_out )
1206cdf0e10cSrcweir                             //                   k2
1207cdf0e10cSrcweir                             //
1208cdf0e10cSrcweir                             // where k1 is the number of chars per draw
1209cdf0e10cSrcweir                             // operation, and k2 is the number of chars
1210cdf0e10cSrcweir                             // per bitmap pixel. This is approximately 50
1211cdf0e10cSrcweir                             // and 7 for current PDF writer, respectively.
1212cdf0e10cSrcweir                             //
1213cdf0e10cSrcweir                             const double	k1( 50 );
1214cdf0e10cSrcweir                             const double	k2( 7 );
1215cdf0e10cSrcweir                             const Size 		aSize( rOrg.GetSize() );
1216cdf0e10cSrcweir                             const double 	Abitmap( k1/k2 * aSize.Width()*aSize.Height() );
1217cdf0e10cSrcweir 
1218cdf0e10cSrcweir                             aObject.DrawTiled( pOut, rOrg, aGrfSize, Size(0,0),
1219cdf0e10cSrcweir                                                NULL, GRFMGR_DRAW_STANDARD,
1220cdf0e10cSrcweir                                                ::std::max( 128, static_cast<int>( sqrt(sqrt( Abitmap)) + .5 ) ) );
1221cdf0e10cSrcweir                         }
1222cdf0e10cSrcweir                         else
1223cdf0e10cSrcweir                         {
1224cdf0e10cSrcweir                             aObject.DrawTiled( pOut, rOrg, aGrfSize, Size(0,0) );
1225cdf0e10cSrcweir                         }
1226cdf0e10cSrcweir 
1227cdf0e10cSrcweir 						bDraw = sal_False;
1228cdf0e10cSrcweir //						bRetouche = sal_False;
1229cdf0e10cSrcweir 					}
1230cdf0e10cSrcweir 					break;
1231cdf0e10cSrcweir 
1232cdf0e10cSrcweir 		case GPOS_NONE:
1233cdf0e10cSrcweir 					  bDraw = sal_False;
1234cdf0e10cSrcweir 					  break;
1235cdf0e10cSrcweir 
1236cdf0e10cSrcweir 		default: DBG_ASSERT( !pOut, "new Graphic position?" );
1237cdf0e10cSrcweir 	}
1238cdf0e10cSrcweir 	Rectangle aGrf( aPos,aDrawSize );
1239cdf0e10cSrcweir 	if ( bDraw && aGrf.IsOver( rOut ) )
1240cdf0e10cSrcweir 	{
1241cdf0e10cSrcweir 		lcl_DrawGraphic( *pGraphic, pOut, aGrf, rOut );
1242cdf0e10cSrcweir 	}
1243cdf0e10cSrcweir }
1244cdf0e10cSrcweir 
1245cdf0e10cSrcweir //	Rahmen wird nach innen gezeichnet
1246cdf0e10cSrcweir 
DrawBorder(long nScrX,long nScrY,long nScrW,long nScrH,const SvxBoxItem * pBorderData,const SvxBrushItem * pBackground,const SvxShadowItem * pShadow)1247cdf0e10cSrcweir void ScPrintFunc::DrawBorder( long nScrX, long nScrY, long nScrW, long nScrH,
1248cdf0e10cSrcweir 								const SvxBoxItem* pBorderData, const SvxBrushItem* pBackground,
1249cdf0e10cSrcweir 								const SvxShadowItem* pShadow )
1250cdf0e10cSrcweir {
1251cdf0e10cSrcweir 	//!		direkte Ausgabe aus SvxBoxItem !!!
1252cdf0e10cSrcweir 
1253cdf0e10cSrcweir 	if (pBorderData)
1254cdf0e10cSrcweir 		if ( !pBorderData->GetTop() && !pBorderData->GetBottom() && !pBorderData->GetLeft() &&
1255cdf0e10cSrcweir 										!pBorderData->GetRight() )
1256cdf0e10cSrcweir 			pBorderData = NULL;
1257cdf0e10cSrcweir 
1258cdf0e10cSrcweir 	if (!pBorderData && !pBackground && !pShadow)
1259cdf0e10cSrcweir 		return;										// nichts zu tun
1260cdf0e10cSrcweir 
1261cdf0e10cSrcweir 	long nLeft   = 0;
1262cdf0e10cSrcweir 	long nRight  = 0;
1263cdf0e10cSrcweir 	long nTop    = 0;
1264cdf0e10cSrcweir 	long nBottom = 0;
1265cdf0e10cSrcweir 
1266cdf0e10cSrcweir 	//	aFrameRect - aussen um die Umrandung, ohne Schatten
1267cdf0e10cSrcweir 	if ( pShadow && pShadow->GetLocation() != SVX_SHADOW_NONE )
1268cdf0e10cSrcweir 	{
1269cdf0e10cSrcweir 		nLeft	+= (long) ( pShadow->CalcShadowSpace(SHADOW_LEFT)	* nScaleX );
1270cdf0e10cSrcweir 		nRight	+= (long) ( pShadow->CalcShadowSpace(SHADOW_RIGHT)	* nScaleX );
1271cdf0e10cSrcweir 		nTop	+= (long) ( pShadow->CalcShadowSpace(SHADOW_TOP)	* nScaleY );
1272cdf0e10cSrcweir 		nBottom	+= (long) ( pShadow->CalcShadowSpace(SHADOW_BOTTOM)	* nScaleY );
1273cdf0e10cSrcweir 	}
1274cdf0e10cSrcweir 	Rectangle aFrameRect( Point(nScrX+nLeft, nScrY+nTop),
1275cdf0e10cSrcweir 						  Size(nScrW-nLeft-nRight, nScrH-nTop-nBottom) );
1276cdf0e10cSrcweir 
1277cdf0e10cSrcweir 	//	Mitte der Umrandung, um Linien ueber OutputData zu zeichnen:
1278cdf0e10cSrcweir 	if (pBorderData)
1279cdf0e10cSrcweir 	{
1280cdf0e10cSrcweir 		nLeft   += (long) ( lcl_LineTotal(pBorderData->GetLeft())   * nScaleX / 2 );
1281cdf0e10cSrcweir 		nRight  += (long) ( lcl_LineTotal(pBorderData->GetRight())  * nScaleX / 2 );
1282cdf0e10cSrcweir 		nTop    += (long) ( lcl_LineTotal(pBorderData->GetTop())    * nScaleY / 2 );
1283cdf0e10cSrcweir 		nBottom += (long) ( lcl_LineTotal(pBorderData->GetBottom()) * nScaleY / 2 );
1284cdf0e10cSrcweir 	}
1285cdf0e10cSrcweir 	long nEffHeight = nScrH - nTop - nBottom;
1286cdf0e10cSrcweir 	long nEffWidth = nScrW - nLeft - nRight;
1287cdf0e10cSrcweir 	if (nEffHeight<=0 || nEffWidth<=0)
1288cdf0e10cSrcweir 		return;											// leer
1289cdf0e10cSrcweir 
1290cdf0e10cSrcweir 	//	#105733# SvtAccessibilityOptions::GetIsForBorders is no longer used (always assumed sal_True)
1291cdf0e10cSrcweir 	sal_Bool bCellContrast = bUseStyleColor &&
1292cdf0e10cSrcweir 			Application::GetSettings().GetStyleSettings().GetHighContrastMode();
1293cdf0e10cSrcweir 
1294cdf0e10cSrcweir 	if ( pBackground && !bCellContrast )
1295cdf0e10cSrcweir 	{
1296cdf0e10cSrcweir //		Rectangle aBackRect( Point(nScrX+nLeft, nScrY+nTop), Size(nEffWidth,nEffHeight) );
1297cdf0e10cSrcweir 		if (pBackground->GetGraphicPos() != GPOS_NONE)
1298cdf0e10cSrcweir 		{
1299cdf0e10cSrcweir 			OutputDevice* pRefDev;
1300cdf0e10cSrcweir 			if ( bIsRender )
1301cdf0e10cSrcweir 				pRefDev = pDev;					// don't use printer for PDF
1302cdf0e10cSrcweir 			else
1303cdf0e10cSrcweir 				pRefDev = pDoc->GetPrinter();	// use printer also for preview
1304cdf0e10cSrcweir 
1305cdf0e10cSrcweir 			lcl_DrawGraphic( *pBackground, pDev, pRefDev, aFrameRect, aFrameRect );
1306cdf0e10cSrcweir 		}
1307cdf0e10cSrcweir 		else
1308cdf0e10cSrcweir 		{
1309cdf0e10cSrcweir 			pDev->SetFillColor(pBackground->GetColor());
1310cdf0e10cSrcweir 			pDev->SetLineColor();
1311cdf0e10cSrcweir 			pDev->DrawRect(aFrameRect);
1312cdf0e10cSrcweir 		}
1313cdf0e10cSrcweir 	}
1314cdf0e10cSrcweir 
1315cdf0e10cSrcweir 	if ( pShadow && pShadow->GetLocation() != SVX_SHADOW_NONE )
1316cdf0e10cSrcweir 	{
1317cdf0e10cSrcweir 		if ( bCellContrast )
1318cdf0e10cSrcweir             pDev->SetFillColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
1319cdf0e10cSrcweir 		else
1320cdf0e10cSrcweir 			pDev->SetFillColor(pShadow->GetColor());
1321cdf0e10cSrcweir 		pDev->SetLineColor();
1322cdf0e10cSrcweir 		long nShadowX = (long) ( pShadow->GetWidth() * nScaleX );
1323cdf0e10cSrcweir 		long nShadowY = (long) ( pShadow->GetWidth() * nScaleY );
1324cdf0e10cSrcweir 		switch (pShadow->GetLocation())
1325cdf0e10cSrcweir 		{
1326cdf0e10cSrcweir 			case SVX_SHADOW_TOPLEFT:
1327cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1328cdf0e10cSrcweir 						aFrameRect.Left()-nShadowX, aFrameRect.Top()-nShadowY,
1329cdf0e10cSrcweir 						aFrameRect.Right()-nShadowX, aFrameRect.Top() ) );
1330cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1331cdf0e10cSrcweir 						aFrameRect.Left()-nShadowX, aFrameRect.Top()-nShadowY,
1332cdf0e10cSrcweir 						aFrameRect.Left(), aFrameRect.Bottom()-nShadowY ) );
1333cdf0e10cSrcweir 				break;
1334cdf0e10cSrcweir 			case SVX_SHADOW_TOPRIGHT:
1335cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1336cdf0e10cSrcweir 						aFrameRect.Left()+nShadowX, aFrameRect.Top()-nShadowY,
1337cdf0e10cSrcweir 						aFrameRect.Right()+nShadowX, aFrameRect.Top() ) );
1338cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1339cdf0e10cSrcweir 						aFrameRect.Right(), aFrameRect.Top()-nShadowY,
1340cdf0e10cSrcweir 						aFrameRect.Right()+nShadowX, aFrameRect.Bottom()-nShadowY ) );
1341cdf0e10cSrcweir 				break;
1342cdf0e10cSrcweir 			case SVX_SHADOW_BOTTOMLEFT:
1343cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1344cdf0e10cSrcweir 						aFrameRect.Left()-nShadowX, aFrameRect.Bottom(),
1345cdf0e10cSrcweir 						aFrameRect.Right()-nShadowX, aFrameRect.Bottom()+nShadowY ) );
1346cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1347cdf0e10cSrcweir 						aFrameRect.Left()-nShadowX, aFrameRect.Top()+nShadowY,
1348cdf0e10cSrcweir 						aFrameRect.Left(), aFrameRect.Bottom()+nShadowY ) );
1349cdf0e10cSrcweir 				break;
1350cdf0e10cSrcweir 			case SVX_SHADOW_BOTTOMRIGHT:
1351cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1352cdf0e10cSrcweir 						aFrameRect.Left()+nShadowX, aFrameRect.Bottom(),
1353cdf0e10cSrcweir 						aFrameRect.Right()+nShadowX, aFrameRect.Bottom()+nShadowY ) );
1354cdf0e10cSrcweir 				pDev->DrawRect( Rectangle(
1355cdf0e10cSrcweir 						aFrameRect.Right(), aFrameRect.Top()+nShadowY,
1356cdf0e10cSrcweir 						aFrameRect.Right()+nShadowX, aFrameRect.Bottom()+nShadowY ) );
1357cdf0e10cSrcweir 				break;
1358cdf0e10cSrcweir             default:
1359cdf0e10cSrcweir             {
1360cdf0e10cSrcweir                 // added to avoid warnings
1361cdf0e10cSrcweir             }
1362cdf0e10cSrcweir 		}
1363cdf0e10cSrcweir 	}
1364cdf0e10cSrcweir 
1365cdf0e10cSrcweir 	if (pBorderData)
1366cdf0e10cSrcweir 	{
1367cdf0e10cSrcweir 		ScDocument* pBorderDoc = new ScDocument( SCDOCMODE_UNDO );
1368cdf0e10cSrcweir 		pBorderDoc->InitUndo( pDoc, 0,0, sal_True,sal_True );
1369cdf0e10cSrcweir 		if (pBorderData)
1370cdf0e10cSrcweir 			pBorderDoc->ApplyAttr( 0,0,0, *pBorderData );
1371cdf0e10cSrcweir 
1372cdf0e10cSrcweir         ScTableInfo aTabInfo;
1373cdf0e10cSrcweir         pBorderDoc->FillInfo( aTabInfo, 0,0, 0,0, 0,
1374cdf0e10cSrcweir 											nScaleX, nScaleY, sal_False, sal_False );
1375cdf0e10cSrcweir         DBG_ASSERT(aTabInfo.mnArrCount,"nArrCount == 0");
1376cdf0e10cSrcweir 
1377cdf0e10cSrcweir         aTabInfo.mpRowInfo[1].nHeight = (sal_uInt16) nEffHeight;
1378cdf0e10cSrcweir         aTabInfo.mpRowInfo[0].pCellInfo[1].nWidth =
1379cdf0e10cSrcweir             aTabInfo.mpRowInfo[1].pCellInfo[1].nWidth = (sal_uInt16) nEffWidth;
1380cdf0e10cSrcweir 
1381cdf0e10cSrcweir         ScOutputData aOutputData( pDev, OUTTYPE_PRINTER, aTabInfo, pBorderDoc, 0,
1382cdf0e10cSrcweir 									nScrX+nLeft, nScrY+nTop, 0,0, 0,0, nScaleX, nScaleY );
1383cdf0e10cSrcweir 		aOutputData.SetUseStyleColor( bUseStyleColor );
1384cdf0e10cSrcweir 
1385cdf0e10cSrcweir //		pDev->SetMapMode(aTwipMode);
1386cdf0e10cSrcweir 
1387cdf0e10cSrcweir 		if (pBorderData)
1388cdf0e10cSrcweir 			aOutputData.DrawFrame();
1389cdf0e10cSrcweir 
1390cdf0e10cSrcweir 		delete pBorderDoc;
1391cdf0e10cSrcweir 	}
1392cdf0e10cSrcweir }
1393cdf0e10cSrcweir 
PrintColHdr(SCCOL nX1,SCCOL nX2,long nScrX,long nScrY)1394cdf0e10cSrcweir void ScPrintFunc::PrintColHdr( SCCOL nX1, SCCOL nX2, long nScrX, long nScrY )
1395cdf0e10cSrcweir {
1396cdf0e10cSrcweir 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nPrintTab );
1397cdf0e10cSrcweir 	long nLayoutSign = bLayoutRTL ? -1 : 1;
1398cdf0e10cSrcweir 
1399cdf0e10cSrcweir 	Size aOnePixel = pDev->PixelToLogic(Size(1,1));
1400cdf0e10cSrcweir 	long nOneX = aOnePixel.Width();
1401cdf0e10cSrcweir 	long nOneY = aOnePixel.Height();
1402cdf0e10cSrcweir 	SCCOL nCol;
1403cdf0e10cSrcweir 
1404cdf0e10cSrcweir 	long nHeight = (long) (PRINT_HEADER_HEIGHT * nScaleY);
1405cdf0e10cSrcweir 	long nEndY = nScrY + nHeight - nOneY;
1406cdf0e10cSrcweir 
1407cdf0e10cSrcweir 	long nPosX = nScrX;
1408cdf0e10cSrcweir 	if ( bLayoutRTL )
1409cdf0e10cSrcweir 	{
1410cdf0e10cSrcweir 		for (nCol=nX1; nCol<=nX2; nCol++)
1411cdf0e10cSrcweir 			nPosX += (long)( pDoc->GetColWidth( nCol, nPrintTab ) * nScaleX );
1412cdf0e10cSrcweir 	}
1413cdf0e10cSrcweir 	else
1414cdf0e10cSrcweir 		nPosX -= nOneX;
1415cdf0e10cSrcweir 	long nPosY = nScrY - nOneY;
1416cdf0e10cSrcweir 	String aText;
1417cdf0e10cSrcweir 
1418cdf0e10cSrcweir 	for (nCol=nX1; nCol<=nX2; nCol++)
1419cdf0e10cSrcweir 	{
1420cdf0e10cSrcweir 		sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nPrintTab );
1421cdf0e10cSrcweir 		if (nDocW)
1422cdf0e10cSrcweir 		{
1423cdf0e10cSrcweir 			long nWidth = (long) (nDocW * nScaleX);
1424cdf0e10cSrcweir 			long nEndX = nPosX + nWidth * nLayoutSign;
1425cdf0e10cSrcweir 
1426cdf0e10cSrcweir 			pDev->DrawRect( Rectangle( nPosX,nPosY,nEndX,nEndY ) );
1427cdf0e10cSrcweir 
1428cdf0e10cSrcweir             aText = ::ScColToAlpha( nCol);
1429cdf0e10cSrcweir 			long nTextWidth = pDev->GetTextWidth(aText);
1430cdf0e10cSrcweir 			long nTextHeight = pDev->GetTextHeight();
1431cdf0e10cSrcweir 			long nAddX = ( nWidth  - nTextWidth  ) / 2;
1432cdf0e10cSrcweir 			long nAddY = ( nHeight - nTextHeight ) / 2;
1433cdf0e10cSrcweir 			long nTextPosX = nPosX+nAddX;
1434cdf0e10cSrcweir 			if ( bLayoutRTL )
1435cdf0e10cSrcweir 				nTextPosX -= nWidth;
1436cdf0e10cSrcweir 			pDev->DrawText( Point( nTextPosX,nPosY+nAddY ), aText );
1437cdf0e10cSrcweir 
1438cdf0e10cSrcweir 			nPosX = nEndX;
1439cdf0e10cSrcweir 		}
1440cdf0e10cSrcweir 	}
1441cdf0e10cSrcweir }
1442cdf0e10cSrcweir 
PrintRowHdr(SCROW nY1,SCROW nY2,long nScrX,long nScrY)1443cdf0e10cSrcweir void ScPrintFunc::PrintRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY )
1444cdf0e10cSrcweir {
1445cdf0e10cSrcweir 	Size aOnePixel = pDev->PixelToLogic(Size(1,1));
1446cdf0e10cSrcweir 	long nOneX = aOnePixel.Width();
1447cdf0e10cSrcweir 	long nOneY = aOnePixel.Height();
1448cdf0e10cSrcweir 
1449cdf0e10cSrcweir 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nPrintTab );
1450cdf0e10cSrcweir 
1451cdf0e10cSrcweir 	long nWidth = (long) (PRINT_HEADER_WIDTH * nScaleX);
1452cdf0e10cSrcweir 	long nEndX = nScrX + nWidth;
1453cdf0e10cSrcweir 	long nPosX = nScrX;
1454cdf0e10cSrcweir 	if ( !bLayoutRTL )
1455cdf0e10cSrcweir 	{
1456cdf0e10cSrcweir 		nEndX -= nOneX;
1457cdf0e10cSrcweir 		nPosX -= nOneX;
1458cdf0e10cSrcweir 	}
1459cdf0e10cSrcweir 	long nPosY = nScrY - nOneY;
1460cdf0e10cSrcweir 	String aText;
1461cdf0e10cSrcweir 
1462cdf0e10cSrcweir 	for (SCROW nRow=nY1; nRow<=nY2; nRow++)
1463cdf0e10cSrcweir 	{
1464cdf0e10cSrcweir 		sal_uInt16 nDocH = pDoc->GetRowHeight( nRow, nPrintTab );
1465cdf0e10cSrcweir 		if (nDocH)
1466cdf0e10cSrcweir 		{
1467cdf0e10cSrcweir 			long nHeight = (long) (nDocH * nScaleY);
1468cdf0e10cSrcweir 			long nEndY = nPosY + nHeight;
1469cdf0e10cSrcweir 
1470cdf0e10cSrcweir 			pDev->DrawRect( Rectangle( nPosX,nPosY,nEndX,nEndY ) );
1471cdf0e10cSrcweir 
1472cdf0e10cSrcweir 			aText = String::CreateFromInt32( nRow+1 );
1473cdf0e10cSrcweir 			long nTextWidth = pDev->GetTextWidth(aText);
1474cdf0e10cSrcweir 			long nTextHeight = pDev->GetTextHeight();
1475cdf0e10cSrcweir 			long nAddX = ( nWidth  - nTextWidth  ) / 2;
1476cdf0e10cSrcweir 			long nAddY = ( nHeight - nTextHeight ) / 2;
1477cdf0e10cSrcweir 			pDev->DrawText( Point( nPosX+nAddX,nPosY+nAddY ), aText );
1478cdf0e10cSrcweir 
1479cdf0e10cSrcweir 			nPosY = nEndY;
1480cdf0e10cSrcweir 		}
1481cdf0e10cSrcweir 	}
1482cdf0e10cSrcweir }
1483cdf0e10cSrcweir 
LocateColHdr(SCCOL nX1,SCCOL nX2,long nScrX,long nScrY,sal_Bool bRepCol,ScPreviewLocationData & rLocationData)1484cdf0e10cSrcweir void ScPrintFunc::LocateColHdr( SCCOL nX1, SCCOL nX2, long nScrX, long nScrY,
1485cdf0e10cSrcweir 								sal_Bool bRepCol, ScPreviewLocationData& rLocationData )
1486cdf0e10cSrcweir {
1487cdf0e10cSrcweir 	Size aOnePixel = pDev->PixelToLogic(Size(1,1));
1488cdf0e10cSrcweir 	long nOneX = aOnePixel.Width();
1489cdf0e10cSrcweir 	long nOneY = aOnePixel.Height();
1490cdf0e10cSrcweir 
1491cdf0e10cSrcweir 	long nHeight = (long) (PRINT_HEADER_HEIGHT * nScaleY);
1492cdf0e10cSrcweir 	long nEndY = nScrY + nHeight - nOneY;
1493cdf0e10cSrcweir 
1494cdf0e10cSrcweir 	long nPosX = nScrX - nOneX;
1495cdf0e10cSrcweir 	for (SCCOL nCol=nX1; nCol<=nX2; nCol++)
1496cdf0e10cSrcweir 	{
1497cdf0e10cSrcweir 		sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nPrintTab );
1498cdf0e10cSrcweir 		if (nDocW)
1499cdf0e10cSrcweir 			nPosX += (long) (nDocW * nScaleX);
1500cdf0e10cSrcweir 	}
1501cdf0e10cSrcweir 	Rectangle aCellRect( nScrX, nScrY, nPosX, nEndY );
1502cdf0e10cSrcweir 	rLocationData.AddColHeaders( aCellRect, nX1, nX2, bRepCol );
1503cdf0e10cSrcweir }
1504cdf0e10cSrcweir 
LocateRowHdr(SCROW nY1,SCROW nY2,long nScrX,long nScrY,sal_Bool bRepRow,ScPreviewLocationData & rLocationData)1505cdf0e10cSrcweir void ScPrintFunc::LocateRowHdr( SCROW nY1, SCROW nY2, long nScrX, long nScrY,
1506cdf0e10cSrcweir 								sal_Bool bRepRow, ScPreviewLocationData& rLocationData )
1507cdf0e10cSrcweir {
1508cdf0e10cSrcweir 	Size aOnePixel = pDev->PixelToLogic(Size(1,1));
1509cdf0e10cSrcweir 	long nOneX = aOnePixel.Width();
1510cdf0e10cSrcweir 	long nOneY = aOnePixel.Height();
1511cdf0e10cSrcweir 
1512cdf0e10cSrcweir 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nPrintTab );
1513cdf0e10cSrcweir 
1514cdf0e10cSrcweir 	long nWidth = (long) (PRINT_HEADER_WIDTH * nScaleX);
1515cdf0e10cSrcweir 	long nEndX = nScrX + nWidth;
1516cdf0e10cSrcweir 	if ( !bLayoutRTL )
1517cdf0e10cSrcweir 		nEndX -= nOneX;
1518cdf0e10cSrcweir 
1519cdf0e10cSrcweir 	long nPosY = nScrY - nOneY;
1520cdf0e10cSrcweir     nPosY += pDoc->GetScaledRowHeight( nY1, nY2, nPrintTab, nScaleY);
1521cdf0e10cSrcweir 	Rectangle aCellRect( nScrX, nScrY, nEndX, nPosY );
1522cdf0e10cSrcweir 	rLocationData.AddRowHeaders( aCellRect, nY1, nY2, bRepRow );
1523cdf0e10cSrcweir }
1524cdf0e10cSrcweir 
LocateArea(SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,long nScrX,long nScrY,sal_Bool bRepCol,sal_Bool bRepRow,ScPreviewLocationData & rLocationData)1525cdf0e10cSrcweir void ScPrintFunc::LocateArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
1526cdf0e10cSrcweir 								long nScrX, long nScrY, sal_Bool bRepCol, sal_Bool bRepRow,
1527cdf0e10cSrcweir 								ScPreviewLocationData& rLocationData )
1528cdf0e10cSrcweir {
1529cdf0e10cSrcweir 	//	get MapMode for drawing objects (same MapMode as in ScOutputData::PrintDrawingLayer)
1530cdf0e10cSrcweir 
1531cdf0e10cSrcweir 	Point aLogPos = OutputDevice::LogicToLogic(Point(nScrX,nScrY), aOffsetMode, aLogicMode);
1532cdf0e10cSrcweir 	long nLogStX = aLogPos.X();
1533cdf0e10cSrcweir 	long nLogStY = aLogPos.Y();
1534cdf0e10cSrcweir 
1535cdf0e10cSrcweir 	SCCOL nCol;
1536cdf0e10cSrcweir 	Point aTwipOffset;
1537cdf0e10cSrcweir 	for (nCol=0; nCol<nX1; nCol++)
1538cdf0e10cSrcweir 		aTwipOffset.X() -= pDoc->GetColWidth( nCol, nPrintTab );
1539cdf0e10cSrcweir     aTwipOffset.Y() -= pDoc->GetRowHeight( 0, nY1-1, nPrintTab );
1540cdf0e10cSrcweir 
1541cdf0e10cSrcweir 	Point aMMOffset( aTwipOffset );
1542cdf0e10cSrcweir 	aMMOffset.X() = (long)(aMMOffset.X() * HMM_PER_TWIPS);
1543cdf0e10cSrcweir 	aMMOffset.Y() = (long)(aMMOffset.Y() * HMM_PER_TWIPS);
1544cdf0e10cSrcweir 	aMMOffset += Point( nLogStX, nLogStY );
1545cdf0e10cSrcweir 	MapMode aDrawMapMode( MAP_100TH_MM, aMMOffset, aLogicMode.GetScaleX(), aLogicMode.GetScaleY() );
1546cdf0e10cSrcweir 
1547cdf0e10cSrcweir 	//	get pixel rectangle
1548cdf0e10cSrcweir 
1549cdf0e10cSrcweir 	Size aOnePixel = pDev->PixelToLogic(Size(1,1));
1550cdf0e10cSrcweir 	long nOneX = aOnePixel.Width();
1551cdf0e10cSrcweir 	long nOneY = aOnePixel.Height();
1552cdf0e10cSrcweir 
1553cdf0e10cSrcweir 	long nPosX = nScrX - nOneX;
1554cdf0e10cSrcweir 	for (nCol=nX1; nCol<=nX2; nCol++)
1555cdf0e10cSrcweir 	{
1556cdf0e10cSrcweir 		sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nPrintTab );
1557cdf0e10cSrcweir 		if (nDocW)
1558cdf0e10cSrcweir 			nPosX += (long) (nDocW * nScaleX);
1559cdf0e10cSrcweir 	}
1560cdf0e10cSrcweir 
1561cdf0e10cSrcweir 	long nPosY = nScrY - nOneY;
1562cdf0e10cSrcweir     nPosY += pDoc->GetScaledRowHeight( nY1, nY2, nPrintTab, nScaleY);
1563cdf0e10cSrcweir 	Rectangle aCellRect( nScrX, nScrY, nPosX, nPosY );
1564cdf0e10cSrcweir 	rLocationData.AddCellRange( aCellRect, ScRange( nX1,nY1,nPrintTab, nX2,nY2,nPrintTab ),
1565cdf0e10cSrcweir 								bRepCol, bRepRow, aDrawMapMode );
1566cdf0e10cSrcweir }
1567cdf0e10cSrcweir 
PrintArea(SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,long nScrX,long nScrY,sal_Bool bShLeft,sal_Bool bShTop,sal_Bool bShRight,sal_Bool bShBottom)1568cdf0e10cSrcweir void ScPrintFunc::PrintArea( SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
1569cdf0e10cSrcweir 								long nScrX, long nScrY,
1570cdf0e10cSrcweir 								sal_Bool bShLeft, sal_Bool bShTop, sal_Bool bShRight, sal_Bool bShBottom )
1571cdf0e10cSrcweir {
1572cdf0e10cSrcweir     // #i47547# nothing to do if the end of the print area is before the end of
1573cdf0e10cSrcweir     // the repeat columns/rows (don't use negative size for ScOutputData)
1574cdf0e10cSrcweir     if ( nX2 < nX1 || nY2 < nY1 )
1575cdf0e10cSrcweir         return;
1576cdf0e10cSrcweir 
1577cdf0e10cSrcweir 							//!		Flag bei FillInfo uebergeben !!!!!
1578cdf0e10cSrcweir     ScRange aERange;
1579cdf0e10cSrcweir 	sal_Bool bEmbed = pDoc->IsEmbedded();
1580cdf0e10cSrcweir 	if (bEmbed)
1581cdf0e10cSrcweir 	{
1582cdf0e10cSrcweir 		pDoc->GetEmbedded(aERange);
1583cdf0e10cSrcweir 		pDoc->ResetEmbedded();
1584cdf0e10cSrcweir 	}
1585cdf0e10cSrcweir 
1586cdf0e10cSrcweir 	Point aPos = OutputDevice::LogicToLogic(Point(nScrX,nScrY), aOffsetMode, aLogicMode);
1587cdf0e10cSrcweir 	long nLogStX = aPos.X();
1588cdf0e10cSrcweir 	long nLogStY = aPos.Y();
1589cdf0e10cSrcweir 
1590cdf0e10cSrcweir 					//	Daten zusammenstellen
1591cdf0e10cSrcweir 
1592cdf0e10cSrcweir     ScTableInfo aTabInfo;
1593cdf0e10cSrcweir     pDoc->FillInfo( aTabInfo, nX1, nY1, nX2, nY2, nPrintTab,
1594cdf0e10cSrcweir 										nScaleX, nScaleY, sal_True, aTableParam.bFormulas );
1595cdf0e10cSrcweir     lcl_HidePrint( aTabInfo, nX1, nX2 );
1596cdf0e10cSrcweir 
1597cdf0e10cSrcweir 	if (bEmbed)
1598cdf0e10cSrcweir 		pDoc->SetEmbedded(aERange);
1599cdf0e10cSrcweir 
1600cdf0e10cSrcweir     ScOutputData aOutputData( pDev, OUTTYPE_PRINTER, aTabInfo, pDoc, nPrintTab,
1601cdf0e10cSrcweir 								nScrX, nScrY, nX1, nY1, nX2, nY2, nScaleX, nScaleY );
1602cdf0e10cSrcweir 
1603cdf0e10cSrcweir 	// #114135#
1604cdf0e10cSrcweir 	aOutputData.SetDrawView( pDrawView );
1605cdf0e10cSrcweir 
1606cdf0e10cSrcweir 	// test if all paint parts are hidden, then a paint is not necessary at all
1607cdf0e10cSrcweir 	const Point aMMOffset(aOutputData.PrePrintDrawingLayer(nLogStX, nLogStY));
1608cdf0e10cSrcweir     const bool bHideAllDrawingLayer( pDrawView && pDrawView->getHideOle() && pDrawView->getHideChart()
1609cdf0e10cSrcweir             && pDrawView->getHideDraw() && pDrawView->getHideFormControl() );
1610cdf0e10cSrcweir 
1611cdf0e10cSrcweir     if(!bHideAllDrawingLayer)
1612cdf0e10cSrcweir 	{
1613cdf0e10cSrcweir 		pDev->SetMapMode(aLogicMode);
1614cdf0e10cSrcweir 		//	hier kein Clipping setzen (Mapmode wird verschoben)
1615cdf0e10cSrcweir 
1616cdf0e10cSrcweir 		// #i72502#
1617cdf0e10cSrcweir 		aOutputData.PrintDrawingLayer(SC_LAYER_BACK, aMMOffset);
1618cdf0e10cSrcweir 	}
1619cdf0e10cSrcweir 
1620cdf0e10cSrcweir 	pDev->SetMapMode(aOffsetMode);
1621cdf0e10cSrcweir 
1622cdf0e10cSrcweir 	aOutputData.SetShowFormulas( aTableParam.bFormulas );
1623cdf0e10cSrcweir 	aOutputData.SetShowNullValues( aTableParam.bNullVals );
1624cdf0e10cSrcweir 	aOutputData.SetUseStyleColor( bUseStyleColor );
1625cdf0e10cSrcweir 
1626cdf0e10cSrcweir 	Color aGridColor( COL_BLACK );
1627cdf0e10cSrcweir 	if ( bUseStyleColor )
1628cdf0e10cSrcweir         aGridColor.SetColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
1629cdf0e10cSrcweir 	aOutputData.SetGridColor( aGridColor );
1630cdf0e10cSrcweir 
1631cdf0e10cSrcweir 	if ( !pPrinter )
1632cdf0e10cSrcweir 	{
1633cdf0e10cSrcweir 		OutputDevice* pRefDev = pDoc->GetPrinter();		// auch fuer Preview den Drucker nehmen
1634cdf0e10cSrcweir 		Fraction aPrintFrac( nZoom, 100 );				// ohne nManualZoom
1635cdf0e10cSrcweir 		//	MapMode, wie er beim Drucken herauskommen wuerde:
1636cdf0e10cSrcweir 		pRefDev->SetMapMode( MapMode( MAP_100TH_MM, Point(), aPrintFrac, aPrintFrac ) );
1637cdf0e10cSrcweir 
1638cdf0e10cSrcweir 		//	when rendering (PDF), don't use printer as ref device, but printer's MapMode
1639cdf0e10cSrcweir 		//	has to be set anyway, as charts still use it (#106409#)
1640cdf0e10cSrcweir 		if ( !bIsRender )
1641cdf0e10cSrcweir 			aOutputData.SetRefDevice( pRefDev );
1642cdf0e10cSrcweir 	}
1643cdf0e10cSrcweir 
1644cdf0e10cSrcweir //	aOutputData.SetMetaFileMode(sal_True);
1645cdf0e10cSrcweir     if( aTableParam.bCellContent )
1646cdf0e10cSrcweir 	    aOutputData.DrawBackground();
1647cdf0e10cSrcweir 
1648cdf0e10cSrcweir 	pDev->SetClipRegion( Rectangle( aPos, Size( aOutputData.GetScrW(), aOutputData.GetScrH() ) ) );
1649cdf0e10cSrcweir 	pDev->SetClipRegion();
1650cdf0e10cSrcweir 
1651cdf0e10cSrcweir //	aOutputData.SetMetaFileMode(sal_False);
1652cdf0e10cSrcweir     if( aTableParam.bCellContent )
1653cdf0e10cSrcweir     {
1654cdf0e10cSrcweir 	    aOutputData.DrawExtraShadow( bShLeft, bShTop, bShRight, bShBottom );
1655cdf0e10cSrcweir 	    aOutputData.DrawFrame();
1656cdf0e10cSrcweir 	    aOutputData.DrawStrings();
1657cdf0e10cSrcweir 
1658cdf0e10cSrcweir     //	pDev->SetMapMode(aLogicMode);
1659cdf0e10cSrcweir 	    aOutputData.DrawEdit(sal_False);
1660cdf0e10cSrcweir     }
1661cdf0e10cSrcweir 
1662cdf0e10cSrcweir //	pDev->SetMapMode(aOffsetMode);
1663cdf0e10cSrcweir 	if (aTableParam.bGrid)
1664cdf0e10cSrcweir 		aOutputData.DrawGrid( sal_True, sal_False );	// keine Seitenumbrueche
1665cdf0e10cSrcweir 
1666cdf0e10cSrcweir /*!!!!!!!!!!!		Notizen in Tabelle markieren ??????????????????????????
1667cdf0e10cSrcweir 
1668cdf0e10cSrcweir 	if (aTableParam.bNotes)
1669cdf0e10cSrcweir 	{
1670cdf0e10cSrcweir 		pDev->SetMapMode(aOffsetMode);
1671cdf0e10cSrcweir 		aOutputData.PrintNoteMarks(aNotePosList);
1672cdf0e10cSrcweir 		pDev->SetMapMode(aLogicMode);
1673cdf0e10cSrcweir 	}
1674cdf0e10cSrcweir */
1675cdf0e10cSrcweir 
1676cdf0e10cSrcweir     aOutputData.AddPDFNotes();      // has no effect if not rendering PDF with notes enabled
1677cdf0e10cSrcweir 
1678cdf0e10cSrcweir //	pDev->SetMapMode(aDrawMode);
1679cdf0e10cSrcweir 
1680cdf0e10cSrcweir 	// test if all paint parts are hidden, then a paint is not necessary at all
1681cdf0e10cSrcweir 	if(!bHideAllDrawingLayer)
1682cdf0e10cSrcweir 	{
1683cdf0e10cSrcweir 		// #i72502#
1684cdf0e10cSrcweir 		aOutputData.PrintDrawingLayer(SC_LAYER_FRONT, aMMOffset);
1685cdf0e10cSrcweir 	}
1686cdf0e10cSrcweir 
1687cdf0e10cSrcweir 	// #i72502#
1688cdf0e10cSrcweir 	aOutputData.PrintDrawingLayer(SC_LAYER_INTERN, aMMOffset);
1689cdf0e10cSrcweir 	aOutputData.PostPrintDrawingLayer(aMMOffset); // #i74768#
1690cdf0e10cSrcweir }
1691cdf0e10cSrcweir 
IsMirror(long nPageNo)1692cdf0e10cSrcweir sal_Bool ScPrintFunc::IsMirror( long nPageNo )			// Raender spiegeln ?
1693cdf0e10cSrcweir {
1694cdf0e10cSrcweir 	SvxPageUsage eUsage = (SvxPageUsage) ( nPageUsage & 0x000f );
1695cdf0e10cSrcweir 	return ( eUsage == SVX_PAGE_MIRROR && (nPageNo & 1) );
1696cdf0e10cSrcweir }
1697cdf0e10cSrcweir 
IsLeft(long nPageNo)1698cdf0e10cSrcweir sal_Bool ScPrintFunc::IsLeft( long nPageNo )			// linke Fussnoten ?
1699cdf0e10cSrcweir {
1700cdf0e10cSrcweir 	SvxPageUsage eUsage = (SvxPageUsage) ( nPageUsage & 0x000f );
1701cdf0e10cSrcweir 	sal_Bool bLeft;
1702cdf0e10cSrcweir 	if (eUsage == SVX_PAGE_LEFT)
1703cdf0e10cSrcweir 		bLeft = sal_True;
1704cdf0e10cSrcweir 	else if (eUsage == SVX_PAGE_RIGHT)
1705cdf0e10cSrcweir 		bLeft = sal_False;
1706cdf0e10cSrcweir 	else
1707cdf0e10cSrcweir 		bLeft = (nPageNo & 1) != 0;
1708cdf0e10cSrcweir 	return bLeft;
1709cdf0e10cSrcweir }
1710cdf0e10cSrcweir 
MakeTableString()1711cdf0e10cSrcweir void ScPrintFunc::MakeTableString()
1712cdf0e10cSrcweir {
1713cdf0e10cSrcweir 	pDoc->GetName( nPrintTab, aFieldData.aTabName );
1714cdf0e10cSrcweir }
1715cdf0e10cSrcweir 
MakeEditEngine()1716cdf0e10cSrcweir void ScPrintFunc::MakeEditEngine()
1717cdf0e10cSrcweir {
1718cdf0e10cSrcweir 	if (!pEditEngine)
1719cdf0e10cSrcweir 	{
1720cdf0e10cSrcweir 		//	can't use document's edit engine pool here,
1721cdf0e10cSrcweir 		//	because pool must have twips as default metric
1722cdf0e10cSrcweir 		pEditEngine = new ScHeaderEditEngine( EditEngine::CreatePool(), sal_True );
1723cdf0e10cSrcweir 
1724cdf0e10cSrcweir 		pEditEngine->EnableUndo(sal_False);
1725cdf0e10cSrcweir 		pEditEngine->SetRefDevice( pDev );
1726cdf0e10cSrcweir 		pEditEngine->SetWordDelimiters(
1727cdf0e10cSrcweir 				ScEditUtil::ModifyDelimiters( pEditEngine->GetWordDelimiters() ) );
1728cdf0e10cSrcweir 		pEditEngine->SetControlWord( pEditEngine->GetControlWord() & ~EE_CNTRL_RTFSTYLESHEETS );
1729cdf0e10cSrcweir         pDoc->ApplyAsianEditSettings( *pEditEngine );
1730cdf0e10cSrcweir 		pEditEngine->EnableAutoColor( bUseStyleColor );
1731cdf0e10cSrcweir 
1732cdf0e10cSrcweir 		//	Default-Set fuer Ausrichtung
1733cdf0e10cSrcweir 		pEditDefaults = new SfxItemSet( pEditEngine->GetEmptyItemSet() );
1734cdf0e10cSrcweir 
1735cdf0e10cSrcweir 		const ScPatternAttr& rPattern = (const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN);
1736cdf0e10cSrcweir 		rPattern.FillEditItemSet( pEditDefaults );
1737cdf0e10cSrcweir 		//	FillEditItemSet adjusts font height to 1/100th mm,
1738cdf0e10cSrcweir 		//	but for header/footer twips is needed, as in the PatternAttr:
1739cdf0e10cSrcweir 		pEditDefaults->Put( rPattern.GetItem(ATTR_FONT_HEIGHT), EE_CHAR_FONTHEIGHT );
1740cdf0e10cSrcweir 		pEditDefaults->Put( rPattern.GetItem(ATTR_CJK_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CJK );
1741cdf0e10cSrcweir 		pEditDefaults->Put( rPattern.GetItem(ATTR_CTL_FONT_HEIGHT), EE_CHAR_FONTHEIGHT_CTL );
1742cdf0e10cSrcweir 		//	#69193# dont use font color, because background color is not used
1743cdf0e10cSrcweir 		//!	there's no way to set the background for note pages
1744cdf0e10cSrcweir 		pEditDefaults->ClearItem( EE_CHAR_COLOR );
1745cdf0e10cSrcweir 		if (ScGlobal::IsSystemRTL())
1746cdf0e10cSrcweir 			pEditDefaults->Put( SvxFrameDirectionItem( FRMDIR_HORI_RIGHT_TOP, EE_PARA_WRITINGDIR ) );
1747cdf0e10cSrcweir 	}
1748cdf0e10cSrcweir 
1749cdf0e10cSrcweir 	pEditEngine->SetData( aFieldData );		// Seitennummer etc. setzen
1750cdf0e10cSrcweir }
1751cdf0e10cSrcweir 
1752cdf0e10cSrcweir //	nStartY = logic
PrintHF(long nPageNo,sal_Bool bHeader,long nStartY,sal_Bool bDoPrint,ScPreviewLocationData * pLocationData)1753cdf0e10cSrcweir void ScPrintFunc::PrintHF( long nPageNo, sal_Bool bHeader, long nStartY,
1754cdf0e10cSrcweir 							sal_Bool bDoPrint, ScPreviewLocationData* pLocationData )
1755cdf0e10cSrcweir {
1756cdf0e10cSrcweir 	const ScPrintHFParam& rParam = bHeader ? aHdr : aFtr;
1757cdf0e10cSrcweir 
1758cdf0e10cSrcweir 	pDev->SetMapMode( aTwipMode );			// Kopf-/Fusszeilen in Twips
1759cdf0e10cSrcweir 
1760cdf0e10cSrcweir 	sal_Bool bLeft = IsLeft(nPageNo) && !rParam.bShared;
1761cdf0e10cSrcweir 	const ScPageHFItem* pHFItem = bLeft ? rParam.pLeft : rParam.pRight;
1762cdf0e10cSrcweir 
1763cdf0e10cSrcweir 	long nLineStartX = aPageRect.Left()  + rParam.nLeft;
1764cdf0e10cSrcweir 	long nLineEndX	 = aPageRect.Right() - rParam.nRight;
1765cdf0e10cSrcweir 	long nLineWidth  = nLineEndX - nLineStartX + 1;
1766cdf0e10cSrcweir 
1767cdf0e10cSrcweir 	//	Edit-Engine
1768cdf0e10cSrcweir 
1769cdf0e10cSrcweir 	Point aStart( nLineStartX, nStartY );
1770cdf0e10cSrcweir 	Size aPaperSize( nLineWidth, rParam.nHeight-rParam.nDistance );
1771cdf0e10cSrcweir 	if ( rParam.pBorder )
1772cdf0e10cSrcweir 	{
1773cdf0e10cSrcweir 		long nLeft = lcl_LineTotal( rParam.pBorder->GetLeft() ) + rParam.pBorder->GetDistance(BOX_LINE_LEFT);
1774cdf0e10cSrcweir 		long nTop = lcl_LineTotal( rParam.pBorder->GetTop() ) + rParam.pBorder->GetDistance(BOX_LINE_TOP);
1775cdf0e10cSrcweir 		aStart.X() += nLeft;
1776cdf0e10cSrcweir 		aStart.Y() += nTop;
1777cdf0e10cSrcweir 		aPaperSize.Width() -= nLeft + lcl_LineTotal( rParam.pBorder->GetRight() ) + rParam.pBorder->GetDistance(BOX_LINE_RIGHT);
1778cdf0e10cSrcweir 		aPaperSize.Height() -= nTop + lcl_LineTotal( rParam.pBorder->GetBottom() ) + rParam.pBorder->GetDistance(BOX_LINE_BOTTOM);
1779cdf0e10cSrcweir 	}
1780cdf0e10cSrcweir 
1781cdf0e10cSrcweir 	if ( rParam.pShadow && rParam.pShadow->GetLocation() != SVX_SHADOW_NONE )
1782cdf0e10cSrcweir 	{
1783cdf0e10cSrcweir 		long nLeft	= rParam.pShadow->CalcShadowSpace(SHADOW_LEFT);
1784cdf0e10cSrcweir 		long nTop	= rParam.pShadow->CalcShadowSpace(SHADOW_TOP);
1785cdf0e10cSrcweir 		aStart.X() += nLeft;
1786cdf0e10cSrcweir 		aStart.Y() += nTop;
1787cdf0e10cSrcweir 		aPaperSize.Width() -= nLeft + rParam.pShadow->CalcShadowSpace(SHADOW_RIGHT);
1788cdf0e10cSrcweir 		aPaperSize.Height() -= nTop + rParam.pShadow->CalcShadowSpace(SHADOW_BOTTOM);
1789cdf0e10cSrcweir 	}
1790cdf0e10cSrcweir 
1791cdf0e10cSrcweir 	aFieldData.nPageNo = nPageNo+aTableParam.nFirstPageNo;
1792cdf0e10cSrcweir 	MakeEditEngine();
1793cdf0e10cSrcweir 
1794cdf0e10cSrcweir 	pEditEngine->SetPaperSize(aPaperSize);
1795cdf0e10cSrcweir 	const EditTextObject* pObject;
1796cdf0e10cSrcweir 
1797cdf0e10cSrcweir 	//	Rahmen / Hintergrund
1798cdf0e10cSrcweir 
1799cdf0e10cSrcweir 	Point aBorderStart( nLineStartX, nStartY );
1800cdf0e10cSrcweir 	Size aBorderSize( nLineWidth, rParam.nHeight-rParam.nDistance );
1801cdf0e10cSrcweir 	if ( rParam.bDynamic )
1802cdf0e10cSrcweir 	{
1803cdf0e10cSrcweir 		//	hier nochmal anpassen, wegen geraden/ungeraden Kopf/Fusszeilen
1804cdf0e10cSrcweir 		//	und evtl. anderen Umbruechen durch Variablen (Seitennummer etc.)
1805cdf0e10cSrcweir 
1806cdf0e10cSrcweir 		long nMaxHeight = 0;
1807cdf0e10cSrcweir 		nMaxHeight = Max( nMaxHeight, TextHeight( pHFItem->GetLeftArea() ) );
1808cdf0e10cSrcweir 		nMaxHeight = Max( nMaxHeight, TextHeight( pHFItem->GetCenterArea() ) );
1809cdf0e10cSrcweir 		nMaxHeight = Max( nMaxHeight, TextHeight( pHFItem->GetRightArea() ) );
1810cdf0e10cSrcweir 		if (rParam.pBorder)
1811cdf0e10cSrcweir 			nMaxHeight += lcl_LineTotal( rParam.pBorder->GetTop() ) +
1812cdf0e10cSrcweir 						  lcl_LineTotal( rParam.pBorder->GetBottom() ) +
1813cdf0e10cSrcweir 									rParam.pBorder->GetDistance(BOX_LINE_TOP) +
1814cdf0e10cSrcweir 									rParam.pBorder->GetDistance(BOX_LINE_BOTTOM);
1815cdf0e10cSrcweir 		if (rParam.pShadow && rParam.pShadow->GetLocation() != SVX_SHADOW_NONE)
1816cdf0e10cSrcweir 			nMaxHeight += rParam.pShadow->CalcShadowSpace(SHADOW_TOP) +
1817cdf0e10cSrcweir 						  rParam.pShadow->CalcShadowSpace(SHADOW_BOTTOM);
1818cdf0e10cSrcweir 
1819cdf0e10cSrcweir 		if (nMaxHeight < rParam.nManHeight-rParam.nDistance)
1820cdf0e10cSrcweir 			nMaxHeight = rParam.nManHeight-rParam.nDistance;		// eingestelltes Minimum
1821cdf0e10cSrcweir 
1822cdf0e10cSrcweir 		aBorderSize.Height() = nMaxHeight;
1823cdf0e10cSrcweir 	}
1824cdf0e10cSrcweir 
1825cdf0e10cSrcweir 	if ( bDoPrint )
1826cdf0e10cSrcweir 	{
1827cdf0e10cSrcweir 		double nOldScaleX = nScaleX;
1828cdf0e10cSrcweir 		double nOldScaleY = nScaleY;
1829cdf0e10cSrcweir 		nScaleX = nScaleY = 1.0;			// direkt in Twips ausgeben
1830cdf0e10cSrcweir 		DrawBorder( aBorderStart.X(), aBorderStart.Y(), aBorderSize.Width(), aBorderSize.Height(),
1831cdf0e10cSrcweir 						rParam.pBorder, rParam.pBack, rParam.pShadow );
1832cdf0e10cSrcweir 		nScaleX = nOldScaleX;
1833cdf0e10cSrcweir 		nScaleY = nOldScaleY;
1834cdf0e10cSrcweir 
1835cdf0e10cSrcweir 		//	Clipping fuer Text
1836cdf0e10cSrcweir 
1837cdf0e10cSrcweir 		pDev->SetClipRegion( Rectangle( aStart, aPaperSize ) );
1838cdf0e10cSrcweir 
1839cdf0e10cSrcweir 		//	links
1840cdf0e10cSrcweir 
1841cdf0e10cSrcweir 		pObject = pHFItem->GetLeftArea();
1842cdf0e10cSrcweir 		if (pObject)
1843cdf0e10cSrcweir 		{
1844cdf0e10cSrcweir 			pEditDefaults->Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
1845cdf0e10cSrcweir 			pEditEngine->SetTextNewDefaults( *pObject, *pEditDefaults, sal_False );
1846cdf0e10cSrcweir 			Point aDraw = aStart;
1847cdf0e10cSrcweir 			long nDif = aPaperSize.Height() - (long) pEditEngine->GetTextHeight();
1848cdf0e10cSrcweir 			if (nDif > 0)
1849cdf0e10cSrcweir 				aDraw.Y() += nDif / 2;
1850cdf0e10cSrcweir 			pEditEngine->Draw( pDev, aDraw, 0 );
1851cdf0e10cSrcweir 		}
1852cdf0e10cSrcweir 
1853cdf0e10cSrcweir 		//	Mitte
1854cdf0e10cSrcweir 
1855cdf0e10cSrcweir 		pObject = pHFItem->GetCenterArea();
1856cdf0e10cSrcweir 		if (pObject)
1857cdf0e10cSrcweir 		{
1858cdf0e10cSrcweir 			pEditDefaults->Put( SvxAdjustItem( SVX_ADJUST_CENTER, EE_PARA_JUST ) );
1859cdf0e10cSrcweir 			pEditEngine->SetTextNewDefaults( *pObject, *pEditDefaults, sal_False );
1860cdf0e10cSrcweir 			Point aDraw = aStart;
1861cdf0e10cSrcweir 			long nDif = aPaperSize.Height() - (long) pEditEngine->GetTextHeight();
1862cdf0e10cSrcweir 			if (nDif > 0)
1863cdf0e10cSrcweir 				aDraw.Y() += nDif / 2;
1864cdf0e10cSrcweir 			pEditEngine->Draw( pDev, aDraw, 0 );
1865cdf0e10cSrcweir 		}
1866cdf0e10cSrcweir 
1867cdf0e10cSrcweir 		//	rechts
1868cdf0e10cSrcweir 
1869cdf0e10cSrcweir 		pObject = pHFItem->GetRightArea();
1870cdf0e10cSrcweir 		if (pObject)
1871cdf0e10cSrcweir 		{
1872cdf0e10cSrcweir 			pEditDefaults->Put( SvxAdjustItem( SVX_ADJUST_RIGHT, EE_PARA_JUST ) );
1873cdf0e10cSrcweir 			pEditEngine->SetTextNewDefaults( *pObject, *pEditDefaults, sal_False );
1874cdf0e10cSrcweir 			Point aDraw = aStart;
1875cdf0e10cSrcweir 			long nDif = aPaperSize.Height() - (long) pEditEngine->GetTextHeight();
1876cdf0e10cSrcweir 			if (nDif > 0)
1877cdf0e10cSrcweir 				aDraw.Y() += nDif / 2;
1878cdf0e10cSrcweir 			pEditEngine->Draw( pDev, aDraw, 0 );
1879cdf0e10cSrcweir 		}
1880cdf0e10cSrcweir 
1881cdf0e10cSrcweir 		pDev->SetClipRegion();
1882cdf0e10cSrcweir 	}
1883cdf0e10cSrcweir 
1884cdf0e10cSrcweir 	if ( pLocationData )
1885cdf0e10cSrcweir 	{
1886cdf0e10cSrcweir 		Rectangle aHeaderRect( aBorderStart, aBorderSize );
1887cdf0e10cSrcweir 		pLocationData->AddHeaderFooter( aHeaderRect, bHeader, bLeft );
1888cdf0e10cSrcweir 	}
1889cdf0e10cSrcweir }
1890cdf0e10cSrcweir 
DoNotes(long nNoteStart,sal_Bool bDoPrint,ScPreviewLocationData * pLocationData)1891cdf0e10cSrcweir long ScPrintFunc::DoNotes( long nNoteStart, sal_Bool bDoPrint, ScPreviewLocationData* pLocationData )
1892cdf0e10cSrcweir {
1893cdf0e10cSrcweir 	if (bDoPrint)
1894cdf0e10cSrcweir 		pDev->SetMapMode(aTwipMode);
1895cdf0e10cSrcweir 
1896cdf0e10cSrcweir 	MakeEditEngine();
1897cdf0e10cSrcweir 	pEditDefaults->Put( SvxAdjustItem( SVX_ADJUST_LEFT, EE_PARA_JUST ) );
1898cdf0e10cSrcweir 	pEditEngine->SetDefaults( *pEditDefaults );
1899cdf0e10cSrcweir 
1900cdf0e10cSrcweir 	Font aMarkFont;
1901cdf0e10cSrcweir 	ScAutoFontColorMode eColorMode = bUseStyleColor ? SC_AUTOCOL_DISPLAY : SC_AUTOCOL_PRINT;
1902cdf0e10cSrcweir 	((const ScPatternAttr&)pDoc->GetPool()->GetDefaultItem(ATTR_PATTERN)).GetFont( aMarkFont, eColorMode );
1903cdf0e10cSrcweir //?	aMarkFont.SetWeight( WEIGHT_BOLD );
1904cdf0e10cSrcweir 	pDev->SetFont( aMarkFont );
1905cdf0e10cSrcweir 	long nMarkLen = pDev->GetTextWidth(
1906cdf0e10cSrcweir 			String::CreateFromAscii(RTL_CONSTASCII_STRINGPARAM("GW99999:")));
1907cdf0e10cSrcweir 	// ohne Space, weil's eh selten so weit kommt
1908cdf0e10cSrcweir 
1909cdf0e10cSrcweir 	Size aDataSize = aPageRect.GetSize();
1910cdf0e10cSrcweir 	if ( nMarkLen > aDataSize.Width() / 2 )		// alles viel zu klein?
1911cdf0e10cSrcweir 		nMarkLen = aDataSize.Width() / 2;		// Seite bruederlich aufteilen
1912cdf0e10cSrcweir 	aDataSize.Width() -= nMarkLen;
1913cdf0e10cSrcweir 
1914cdf0e10cSrcweir 	pEditEngine->SetPaperSize( aDataSize );
1915cdf0e10cSrcweir 	long nPosX = aPageRect.Left() + nMarkLen;
1916cdf0e10cSrcweir 	long nPosY = aPageRect.Top();
1917cdf0e10cSrcweir 
1918cdf0e10cSrcweir 	long nCount = 0;
1919cdf0e10cSrcweir 	sal_Bool bOk;
1920cdf0e10cSrcweir 	do
1921cdf0e10cSrcweir 	{
1922cdf0e10cSrcweir 		bOk = sal_False;
1923cdf0e10cSrcweir 		ScAddress* pPos = (ScAddress*) aNotePosList.GetObject( nNoteStart+nCount );
1924cdf0e10cSrcweir 		if (pPos)
1925cdf0e10cSrcweir 		{
1926cdf0e10cSrcweir 			ScBaseCell* pCell = pDoc->GetCell( *pPos);
1927cdf0e10cSrcweir             if( const ScPostIt* pNote = pCell->GetNote() )
1928cdf0e10cSrcweir 			{
1929cdf0e10cSrcweir 				if(const EditTextObject *pEditText = pNote->GetEditTextObject())
1930cdf0e10cSrcweir 				    pEditEngine->SetText(*pEditText);
1931cdf0e10cSrcweir 				long nTextHeight = pEditEngine->GetTextHeight();
1932cdf0e10cSrcweir 				if ( nPosY + nTextHeight < aPageRect.Bottom() )
1933cdf0e10cSrcweir 				{
1934cdf0e10cSrcweir 					if (bDoPrint)
1935cdf0e10cSrcweir 					{
1936cdf0e10cSrcweir 						pEditEngine->Draw( pDev, Point( nPosX, nPosY ), 0 );
1937cdf0e10cSrcweir 
1938cdf0e10cSrcweir 						String aMarkStr;
1939cdf0e10cSrcweir 						pPos->Format( aMarkStr, SCA_VALID, pDoc, pDoc->GetAddressConvention() );
1940cdf0e10cSrcweir 						aMarkStr += ':';
1941cdf0e10cSrcweir 
1942cdf0e10cSrcweir 						//	Zellposition auch per EditEngine, damit die Position stimmt
1943cdf0e10cSrcweir 						pEditEngine->SetText(aMarkStr);
1944cdf0e10cSrcweir 						pEditEngine->Draw( pDev, Point( aPageRect.Left(), nPosY ), 0 );
1945cdf0e10cSrcweir 					}
1946cdf0e10cSrcweir 
1947cdf0e10cSrcweir 					if ( pLocationData )
1948cdf0e10cSrcweir 					{
1949cdf0e10cSrcweir 						Rectangle aTextRect( Point( nPosX, nPosY ), Size( aDataSize.Width(), nTextHeight ) );
1950cdf0e10cSrcweir 						pLocationData->AddNoteText( aTextRect, *pPos );
1951cdf0e10cSrcweir 						Rectangle aMarkRect( Point( aPageRect.Left(), nPosY ), Size( nMarkLen, nTextHeight ) );
1952cdf0e10cSrcweir 						pLocationData->AddNoteMark( aMarkRect, *pPos );
1953cdf0e10cSrcweir 					}
1954cdf0e10cSrcweir 
1955cdf0e10cSrcweir 					nPosY += nTextHeight;
1956cdf0e10cSrcweir 					nPosY += 200;					// Abstand
1957cdf0e10cSrcweir 					++nCount;
1958cdf0e10cSrcweir 					bOk = sal_True;
1959cdf0e10cSrcweir 				}
1960cdf0e10cSrcweir 			}
1961cdf0e10cSrcweir 		}
1962cdf0e10cSrcweir 	}
1963cdf0e10cSrcweir 	while (bOk);
1964cdf0e10cSrcweir 
1965cdf0e10cSrcweir 	return nCount;
1966cdf0e10cSrcweir }
1967cdf0e10cSrcweir 
PrintNotes(long nPageNo,long nNoteStart,sal_Bool bDoPrint,ScPreviewLocationData * pLocationData)1968cdf0e10cSrcweir long ScPrintFunc::PrintNotes( long nPageNo, long nNoteStart, sal_Bool bDoPrint, ScPreviewLocationData* pLocationData )
1969cdf0e10cSrcweir {
1970cdf0e10cSrcweir 	if ( nNoteStart >= (long) aNotePosList.Count() || !aTableParam.bNotes )
1971cdf0e10cSrcweir 		return 0;
1972cdf0e10cSrcweir 
1973cdf0e10cSrcweir 	if ( bDoPrint && bClearWin )
1974cdf0e10cSrcweir 	{
1975cdf0e10cSrcweir 		//!	mit PrintPage zusammenfassen !!!
1976cdf0e10cSrcweir 
1977cdf0e10cSrcweir 		Color aBackgroundColor( COL_WHITE );
1978cdf0e10cSrcweir 		if ( bUseStyleColor )
1979cdf0e10cSrcweir             aBackgroundColor.SetColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor );
1980cdf0e10cSrcweir 
1981cdf0e10cSrcweir 		pDev->SetMapMode(aOffsetMode);
1982cdf0e10cSrcweir 		pDev->SetLineColor();
1983cdf0e10cSrcweir 		pDev->SetFillColor(aBackgroundColor);
1984cdf0e10cSrcweir 		pDev->DrawRect(Rectangle(Point(),
1985cdf0e10cSrcweir 				Size((long)(aPageSize.Width() * nScaleX * 100 / nZoom),
1986cdf0e10cSrcweir 					 (long)(aPageSize.Height() * nScaleY * 100 / nZoom))));
1987cdf0e10cSrcweir 	}
1988cdf0e10cSrcweir 
1989cdf0e10cSrcweir 
1990cdf0e10cSrcweir 	//		aPageRect auf linke / rechte Seiten anpassen
1991cdf0e10cSrcweir 
1992cdf0e10cSrcweir 	Rectangle aTempRect = Rectangle( Point(), aPageSize );
1993cdf0e10cSrcweir 	if (IsMirror(nPageNo))
1994cdf0e10cSrcweir 	{
1995cdf0e10cSrcweir 		aPageRect.Left()  = ( aTempRect.Left()  + nRightMargin ) * 100 / nZoom;
1996cdf0e10cSrcweir 		aPageRect.Right() = ( aTempRect.Right() - nLeftMargin  ) * 100 / nZoom;
1997cdf0e10cSrcweir 	}
1998cdf0e10cSrcweir 	else
1999cdf0e10cSrcweir 	{
2000cdf0e10cSrcweir 		aPageRect.Left()  = ( aTempRect.Left()  + nLeftMargin  ) * 100 / nZoom;
2001cdf0e10cSrcweir 		aPageRect.Right() = ( aTempRect.Right() - nRightMargin ) * 100 / nZoom;
2002cdf0e10cSrcweir 	}
2003cdf0e10cSrcweir 
2004cdf0e10cSrcweir 	if ( pPrinter && bDoPrint )
2005cdf0e10cSrcweir     {
2006cdf0e10cSrcweir         DBG_ERROR( "StartPage does not exist anymore" );
2007cdf0e10cSrcweir 		// pPrinter->StartPage();
2008cdf0e10cSrcweir     }
2009cdf0e10cSrcweir 
2010cdf0e10cSrcweir 	if ( bDoPrint || pLocationData )
2011cdf0e10cSrcweir 	{
2012cdf0e10cSrcweir 		//	Kopf- und Fusszeilen
2013cdf0e10cSrcweir 
2014cdf0e10cSrcweir 		if (aHdr.bEnable)
2015cdf0e10cSrcweir 		{
2016cdf0e10cSrcweir 			long nHeaderY = aPageRect.Top()-aHdr.nHeight;
2017cdf0e10cSrcweir 			PrintHF( nPageNo, sal_True, nHeaderY, bDoPrint, pLocationData );
2018cdf0e10cSrcweir 		}
2019cdf0e10cSrcweir 		if (aFtr.bEnable)
2020cdf0e10cSrcweir 		{
2021cdf0e10cSrcweir 			long nFooterY = aPageRect.Bottom()+aFtr.nDistance;
2022cdf0e10cSrcweir 			PrintHF( nPageNo, sal_False, nFooterY, bDoPrint, pLocationData );
2023cdf0e10cSrcweir 		}
2024cdf0e10cSrcweir 	}
2025cdf0e10cSrcweir 
2026cdf0e10cSrcweir 	long nCount = DoNotes( nNoteStart, bDoPrint, pLocationData );
2027cdf0e10cSrcweir 
2028cdf0e10cSrcweir 	if ( pPrinter && bDoPrint )
2029cdf0e10cSrcweir     {
2030cdf0e10cSrcweir         DBG_ERROR( "EndPage does not exist anymore" );
2031cdf0e10cSrcweir 		// pPrinter->EndPage();
2032cdf0e10cSrcweir     }
2033cdf0e10cSrcweir 
2034cdf0e10cSrcweir 	return nCount;
2035cdf0e10cSrcweir }
2036cdf0e10cSrcweir 
PrintPage(long nPageNo,SCCOL nX1,SCROW nY1,SCCOL nX2,SCROW nY2,sal_Bool bDoPrint,ScPreviewLocationData * pLocationData)2037cdf0e10cSrcweir void ScPrintFunc::PrintPage( long nPageNo, SCCOL nX1, SCROW nY1, SCCOL nX2, SCROW nY2,
2038cdf0e10cSrcweir 								sal_Bool bDoPrint, ScPreviewLocationData* pLocationData )
2039cdf0e10cSrcweir {
2040cdf0e10cSrcweir 	sal_Bool bLayoutRTL = pDoc->IsLayoutRTL( nPrintTab );
2041cdf0e10cSrcweir 	long nLayoutSign = bLayoutRTL ? -1 : 1;
2042cdf0e10cSrcweir 
2043cdf0e10cSrcweir 	//	nPageNo is the page number within all sheets of one "start page" setting
2044cdf0e10cSrcweir 
2045cdf0e10cSrcweir 	if ( bClearWin && bDoPrint )
2046cdf0e10cSrcweir 	{
2047cdf0e10cSrcweir 		//	muss genau zum Zeichnen des Rahmens in preview.cxx passen !!!
2048cdf0e10cSrcweir 
2049cdf0e10cSrcweir 		Color aBackgroundColor( COL_WHITE );
2050cdf0e10cSrcweir 		if ( bUseStyleColor )
2051cdf0e10cSrcweir             aBackgroundColor.SetColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::DOCCOLOR).nColor );
2052cdf0e10cSrcweir 
2053cdf0e10cSrcweir 		pDev->SetMapMode(aOffsetMode);
2054cdf0e10cSrcweir 		pDev->SetLineColor();
2055cdf0e10cSrcweir 		pDev->SetFillColor(aBackgroundColor);
2056cdf0e10cSrcweir 		pDev->DrawRect(Rectangle(Point(),
2057cdf0e10cSrcweir 				Size((long)(aPageSize.Width() * nScaleX * 100 / nZoom),
2058cdf0e10cSrcweir 					 (long)(aPageSize.Height() * nScaleY * 100 / nZoom))));
2059cdf0e10cSrcweir 	}
2060cdf0e10cSrcweir 
2061cdf0e10cSrcweir 
2062cdf0e10cSrcweir 	//		aPageRect auf linke / rechte Seiten anpassen
2063cdf0e10cSrcweir 
2064cdf0e10cSrcweir 	Rectangle aTempRect = Rectangle( Point(), aPageSize );
2065cdf0e10cSrcweir 	if (IsMirror(nPageNo))
2066cdf0e10cSrcweir 	{
2067cdf0e10cSrcweir 		aPageRect.Left()  = ( aTempRect.Left()  + nRightMargin ) * 100 / nZoom;
2068cdf0e10cSrcweir 		aPageRect.Right() = ( aTempRect.Right() - nLeftMargin  ) * 100 / nZoom;
2069cdf0e10cSrcweir 	}
2070cdf0e10cSrcweir 	else
2071cdf0e10cSrcweir 	{
2072cdf0e10cSrcweir 		aPageRect.Left()  = ( aTempRect.Left()  + nLeftMargin  ) * 100 / nZoom;
2073cdf0e10cSrcweir 		aPageRect.Right() = ( aTempRect.Right() - nRightMargin ) * 100 / nZoom;
2074cdf0e10cSrcweir 	}
2075cdf0e10cSrcweir 
2076cdf0e10cSrcweir 	if ( aAreaParam.bRepeatCol )
2077cdf0e10cSrcweir 		if ( nX1 > nRepeatStartCol && nX1 <= nRepeatEndCol )
2078cdf0e10cSrcweir 			nX1 = nRepeatEndCol + 1;
2079cdf0e10cSrcweir 	sal_Bool bDoRepCol = (aAreaParam.bRepeatCol && nX1 > nRepeatEndCol);
2080cdf0e10cSrcweir 	if ( aAreaParam.bRepeatRow )
2081cdf0e10cSrcweir 		if ( nY1 > nRepeatStartRow && nY1 <= nRepeatEndRow )
2082cdf0e10cSrcweir 			nY1 = nRepeatEndRow + 1;
2083cdf0e10cSrcweir 	sal_Bool bDoRepRow = (aAreaParam.bRepeatRow && nY1 > nRepeatEndRow);
2084cdf0e10cSrcweir 
2085cdf0e10cSrcweir     // use new object hide flags in SdrPaintView
2086cdf0e10cSrcweir     if(pDrawView)
2087cdf0e10cSrcweir     {
2088cdf0e10cSrcweir         pDrawView->setHideOle(!aTableParam.bObjects);
2089cdf0e10cSrcweir         pDrawView->setHideChart(!aTableParam.bCharts);
2090cdf0e10cSrcweir         pDrawView->setHideDraw(!aTableParam.bDrawings);
2091cdf0e10cSrcweir         pDrawView->setHideFormControl(!aTableParam.bDrawings);
2092cdf0e10cSrcweir     }
2093cdf0e10cSrcweir 
2094cdf0e10cSrcweir 	if ( pPrinter && bDoPrint )
2095cdf0e10cSrcweir     {
2096cdf0e10cSrcweir         DBG_ERROR( "StartPage does not exist anymore" );
2097cdf0e10cSrcweir 		// pPrinter->StartPage();
2098cdf0e10cSrcweir     }
2099cdf0e10cSrcweir 
2100cdf0e10cSrcweir 	//	Kopf- und Fusszeilen (ohne Zentrierung)
2101cdf0e10cSrcweir 
2102cdf0e10cSrcweir 	if (aHdr.bEnable)
2103cdf0e10cSrcweir 	{
2104cdf0e10cSrcweir 		long nHeaderY = aPageRect.Top()-aHdr.nHeight;
2105cdf0e10cSrcweir 		PrintHF( nPageNo, sal_True, nHeaderY, bDoPrint, pLocationData );
2106cdf0e10cSrcweir 	}
2107cdf0e10cSrcweir 	if (aFtr.bEnable)
2108cdf0e10cSrcweir 	{
2109cdf0e10cSrcweir 		long nFooterY = aPageRect.Bottom()+aFtr.nDistance;
2110cdf0e10cSrcweir 		PrintHF( nPageNo, sal_False, nFooterY, bDoPrint, pLocationData );
2111cdf0e10cSrcweir 	}
2112cdf0e10cSrcweir 
2113cdf0e10cSrcweir 	//	Position ( Raender / zentrieren )
2114cdf0e10cSrcweir 
2115cdf0e10cSrcweir 	long nLeftSpace = aPageRect.Left();		// Document-Twips
2116cdf0e10cSrcweir 	long nTopSpace  = aPageRect.Top();
2117cdf0e10cSrcweir 	if ( bCenterHor || bLayoutRTL )
2118cdf0e10cSrcweir 	{
2119cdf0e10cSrcweir 		long nDataWidth = 0;
2120cdf0e10cSrcweir         SCCOL i;
2121cdf0e10cSrcweir 		for (i=nX1; i<=nX2; i++)
2122cdf0e10cSrcweir 			nDataWidth += pDoc->GetColWidth( i,nPrintTab );
2123cdf0e10cSrcweir 		if (bDoRepCol)
2124cdf0e10cSrcweir 			for (i=nRepeatStartCol; i<=nRepeatEndCol; i++)
2125cdf0e10cSrcweir 				nDataWidth += pDoc->GetColWidth( i,nPrintTab );
2126cdf0e10cSrcweir 		if (aTableParam.bHeaders)
2127cdf0e10cSrcweir 			nDataWidth += (long) PRINT_HEADER_WIDTH;
2128cdf0e10cSrcweir 		if (pBorderItem)
2129cdf0e10cSrcweir 			nDataWidth += pBorderItem->GetDistance(BOX_LINE_LEFT) +
2130cdf0e10cSrcweir 						   pBorderItem->GetDistance(BOX_LINE_RIGHT);		//! Line width?
2131cdf0e10cSrcweir 		if (pShadowItem && pShadowItem->GetLocation() != SVX_SHADOW_NONE)
2132cdf0e10cSrcweir 			nDataWidth += pShadowItem->CalcShadowSpace(SHADOW_LEFT) +
2133cdf0e10cSrcweir 						   pShadowItem->CalcShadowSpace(SHADOW_RIGHT);
2134cdf0e10cSrcweir 		if ( bCenterHor )
2135cdf0e10cSrcweir 		{
2136cdf0e10cSrcweir 			nLeftSpace += ( aPageRect.GetWidth() - nDataWidth ) / 2;		// LTR or RTL
2137cdf0e10cSrcweir 			if (pBorderItem)
2138cdf0e10cSrcweir 				nLeftSpace -= lcl_LineTotal(pBorderItem->GetLeft());
2139cdf0e10cSrcweir 		}
2140cdf0e10cSrcweir 		else if ( bLayoutRTL )
2141cdf0e10cSrcweir 			nLeftSpace += aPageRect.GetWidth() - nDataWidth;				// align to the right edge of the page
2142cdf0e10cSrcweir 	}
2143cdf0e10cSrcweir 	if ( bCenterVer )
2144cdf0e10cSrcweir 	{
2145cdf0e10cSrcweir         long nDataHeight = pDoc->GetRowHeight( nY1, nY2, nPrintTab);
2146cdf0e10cSrcweir 		if (bDoRepRow)
2147cdf0e10cSrcweir             nDataHeight += pDoc->GetRowHeight( nRepeatStartRow,
2148cdf0e10cSrcweir                     nRepeatEndRow, nPrintTab);
2149cdf0e10cSrcweir 		if (aTableParam.bHeaders)
2150cdf0e10cSrcweir 			nDataHeight += (long) PRINT_HEADER_HEIGHT;
2151cdf0e10cSrcweir 		if (pBorderItem)
2152cdf0e10cSrcweir 			nDataHeight += pBorderItem->GetDistance(BOX_LINE_TOP) +
2153cdf0e10cSrcweir 						   pBorderItem->GetDistance(BOX_LINE_BOTTOM);		//! Line width?
2154cdf0e10cSrcweir 		if (pShadowItem && pShadowItem->GetLocation() != SVX_SHADOW_NONE)
2155cdf0e10cSrcweir 			nDataHeight += pShadowItem->CalcShadowSpace(SHADOW_TOP) +
2156cdf0e10cSrcweir 						   pShadowItem->CalcShadowSpace(SHADOW_BOTTOM);
2157cdf0e10cSrcweir 		nTopSpace += ( aPageRect.GetHeight() - nDataHeight ) / 2;
2158cdf0e10cSrcweir 		if (pBorderItem)
2159cdf0e10cSrcweir 			nTopSpace -= lcl_LineTotal(pBorderItem->GetTop());
2160cdf0e10cSrcweir 	}
2161cdf0e10cSrcweir 
2162cdf0e10cSrcweir 	//	calculate sizes of the elements for partitioning
2163cdf0e10cSrcweir 	//	(header, repeat, data)
2164cdf0e10cSrcweir 
2165cdf0e10cSrcweir 	long nHeaderWidth   = 0;
2166cdf0e10cSrcweir 	long nHeaderHeight  = 0;
2167cdf0e10cSrcweir 	long nRepeatWidth   = 0;
2168cdf0e10cSrcweir 	long nRepeatHeight  = 0;
2169cdf0e10cSrcweir 	long nContentWidth  = 0;		// scaled - not the same as nDataWidth above
2170cdf0e10cSrcweir 	long nContentHeight = 0;
2171cdf0e10cSrcweir 	if (aTableParam.bHeaders)
2172cdf0e10cSrcweir 	{
2173cdf0e10cSrcweir 		nHeaderWidth  = (long) (PRINT_HEADER_WIDTH * nScaleX);
2174cdf0e10cSrcweir 		nHeaderHeight = (long) (PRINT_HEADER_HEIGHT * nScaleY);
2175cdf0e10cSrcweir 	}
2176cdf0e10cSrcweir 	if (bDoRepCol)
2177cdf0e10cSrcweir 		for (SCCOL i=nRepeatStartCol; i<=nRepeatEndCol; i++)
2178cdf0e10cSrcweir 			nRepeatWidth += (long) (pDoc->GetColWidth(i,nPrintTab) * nScaleX);
2179cdf0e10cSrcweir 	if (bDoRepRow)
2180cdf0e10cSrcweir         nRepeatHeight += pDoc->GetScaledRowHeight( nRepeatStartRow,
2181cdf0e10cSrcweir                 nRepeatEndRow, nPrintTab, nScaleY);
2182cdf0e10cSrcweir 	for (SCCOL i=nX1; i<=nX2; i++)
2183cdf0e10cSrcweir 		nContentWidth += (long) (pDoc->GetColWidth(i,nPrintTab) * nScaleX);
2184cdf0e10cSrcweir     nContentHeight += pDoc->GetScaledRowHeight( nY1, nY2, nPrintTab,
2185cdf0e10cSrcweir             nScaleY);
2186cdf0e10cSrcweir 
2187cdf0e10cSrcweir 	//	partition the page
2188cdf0e10cSrcweir 
2189cdf0e10cSrcweir 	long nStartX = ((long) ( nLeftSpace * nScaleX ));
2190cdf0e10cSrcweir 	long nStartY = ((long) ( nTopSpace  * nScaleY ));
2191cdf0e10cSrcweir //		nStartX -= aOffset.X();			// schon im MapMode
2192cdf0e10cSrcweir //		nStartY -= aOffset.Y();
2193cdf0e10cSrcweir 
2194cdf0e10cSrcweir 	long nInnerStartX = nStartX;
2195cdf0e10cSrcweir 	long nInnerStartY = nStartY;
2196cdf0e10cSrcweir 	if (pBorderItem)
2197cdf0e10cSrcweir 	{
2198cdf0e10cSrcweir 		nInnerStartX += (long) ( ( lcl_LineTotal(pBorderItem->GetLeft()) +
2199cdf0e10cSrcweir 									pBorderItem->GetDistance(BOX_LINE_LEFT) ) * nScaleX );
2200cdf0e10cSrcweir 		nInnerStartY += (long) ( ( lcl_LineTotal(pBorderItem->GetTop()) +
2201cdf0e10cSrcweir 									pBorderItem->GetDistance(BOX_LINE_TOP) ) * nScaleY );
2202cdf0e10cSrcweir 	}
2203cdf0e10cSrcweir 	if (pShadowItem && pShadowItem->GetLocation() != SVX_SHADOW_NONE)
2204cdf0e10cSrcweir 	{
2205cdf0e10cSrcweir 		nInnerStartX += (long) ( pShadowItem->CalcShadowSpace(SHADOW_LEFT) * nScaleX );
2206cdf0e10cSrcweir 		nInnerStartY += (long) ( pShadowItem->CalcShadowSpace(SHADOW_TOP) * nScaleY );
2207cdf0e10cSrcweir 	}
2208cdf0e10cSrcweir 
2209cdf0e10cSrcweir 	if ( bLayoutRTL )
2210cdf0e10cSrcweir 	{
2211cdf0e10cSrcweir 		//	arrange elements starting from the right edge
2212cdf0e10cSrcweir 		nInnerStartX += nHeaderWidth + nRepeatWidth + nContentWidth;
2213cdf0e10cSrcweir 
2214cdf0e10cSrcweir 		//	make rounding easier so the elements are really next to each other in preview
2215cdf0e10cSrcweir 		Size aOffsetOnePixel = pDev->PixelToLogic( Size(1,1), aOffsetMode );
2216cdf0e10cSrcweir 		long nOffsetOneX = aOffsetOnePixel.Width();
2217cdf0e10cSrcweir 		nInnerStartX += nOffsetOneX / 2;
2218cdf0e10cSrcweir 	}
2219cdf0e10cSrcweir 
2220cdf0e10cSrcweir 	long nFrameStartX = nInnerStartX;
2221cdf0e10cSrcweir 	long nFrameStartY = nInnerStartY;
2222cdf0e10cSrcweir 
2223cdf0e10cSrcweir 	long nRepStartX = nInnerStartX + nHeaderWidth * nLayoutSign;	// widths/heights are 0 if not used
2224cdf0e10cSrcweir 	long nRepStartY = nInnerStartY + nHeaderHeight;
2225cdf0e10cSrcweir 	long nDataX = nRepStartX + nRepeatWidth * nLayoutSign;
2226cdf0e10cSrcweir 	long nDataY = nRepStartY + nRepeatHeight;
2227cdf0e10cSrcweir 	long nEndX = nDataX + nContentWidth * nLayoutSign;
2228cdf0e10cSrcweir 	long nEndY = nDataY + nContentHeight;
2229cdf0e10cSrcweir 	long nFrameEndX = nEndX;
2230cdf0e10cSrcweir 	long nFrameEndY = nEndY;
2231cdf0e10cSrcweir 
2232cdf0e10cSrcweir 	if ( bLayoutRTL )
2233cdf0e10cSrcweir 	{
2234cdf0e10cSrcweir 		//	each element's start position is its left edge
2235cdf0e10cSrcweir 		//!	subtract one pixel less?
2236cdf0e10cSrcweir 		nInnerStartX -= nHeaderWidth;		// used for header
2237cdf0e10cSrcweir 		nRepStartX   -= nRepeatWidth;
2238cdf0e10cSrcweir 		nDataX       -= nContentWidth;
2239cdf0e10cSrcweir 
2240cdf0e10cSrcweir 		//	continue right of the main elements again
2241cdf0e10cSrcweir 		nEndX += nHeaderWidth + nRepeatWidth + nContentWidth;
2242cdf0e10cSrcweir 	}
2243cdf0e10cSrcweir 
2244cdf0e10cSrcweir 	//	Seiten-Rahmen / Hintergrund
2245cdf0e10cSrcweir 
2246cdf0e10cSrcweir 	//!	nEndX/Y anpassen
2247cdf0e10cSrcweir 
2248cdf0e10cSrcweir 	long nBorderEndX = nEndX;
2249cdf0e10cSrcweir 	long nBorderEndY = nEndY;
2250cdf0e10cSrcweir 	if (pBorderItem)
2251cdf0e10cSrcweir 	{
2252cdf0e10cSrcweir 		nBorderEndX += (long) ( ( lcl_LineTotal(pBorderItem->GetRight()) +
2253cdf0e10cSrcweir 									pBorderItem->GetDistance(BOX_LINE_RIGHT) ) * nScaleX );
2254cdf0e10cSrcweir 		nBorderEndY += (long) ( ( lcl_LineTotal(pBorderItem->GetBottom()) +
2255cdf0e10cSrcweir 									pBorderItem->GetDistance(BOX_LINE_BOTTOM) ) * nScaleY );
2256cdf0e10cSrcweir 	}
2257cdf0e10cSrcweir 	if (pShadowItem && pShadowItem->GetLocation() != SVX_SHADOW_NONE)
2258cdf0e10cSrcweir 	{
2259cdf0e10cSrcweir 		nBorderEndX += (long) ( pShadowItem->CalcShadowSpace(SHADOW_RIGHT) * nScaleX );
2260cdf0e10cSrcweir 		nBorderEndY += (long) ( pShadowItem->CalcShadowSpace(SHADOW_BOTTOM) * nScaleY );
2261cdf0e10cSrcweir 	}
2262cdf0e10cSrcweir 
2263cdf0e10cSrcweir 	if ( bDoPrint )
2264cdf0e10cSrcweir 	{
2265cdf0e10cSrcweir 		pDev->SetMapMode( aOffsetMode );
2266cdf0e10cSrcweir 		DrawBorder( nStartX, nStartY, nBorderEndX-nStartX, nBorderEndY-nStartY,
2267cdf0e10cSrcweir 						pBorderItem, pBackgroundItem, pShadowItem );
2268cdf0e10cSrcweir 
2269cdf0e10cSrcweir 		pDev->SetMapMode( aTwipMode );
2270cdf0e10cSrcweir 	}
2271cdf0e10cSrcweir 
2272cdf0e10cSrcweir 	pDev->SetMapMode( aOffsetMode );
2273cdf0e10cSrcweir 
2274cdf0e10cSrcweir 	//	Wiederholungszeilen/Spalten ausgeben
2275cdf0e10cSrcweir 
2276cdf0e10cSrcweir 	if (bDoRepCol && bDoRepRow)
2277cdf0e10cSrcweir 	{
2278cdf0e10cSrcweir 		if ( bDoPrint )
2279cdf0e10cSrcweir 			PrintArea( nRepeatStartCol,nRepeatStartRow, nRepeatEndCol,nRepeatEndRow,
2280cdf0e10cSrcweir 							nRepStartX,nRepStartY, sal_True,sal_True,sal_False,sal_False );
2281cdf0e10cSrcweir 		if ( pLocationData )
2282cdf0e10cSrcweir 			LocateArea( nRepeatStartCol,nRepeatStartRow, nRepeatEndCol,nRepeatEndRow,
2283cdf0e10cSrcweir 							nRepStartX,nRepStartY, sal_True,sal_True, *pLocationData );
2284cdf0e10cSrcweir 	}
2285cdf0e10cSrcweir 	if (bDoRepCol)
2286cdf0e10cSrcweir 	{
2287cdf0e10cSrcweir 		if ( bDoPrint )
2288cdf0e10cSrcweir 			PrintArea( nRepeatStartCol,nY1, nRepeatEndCol,nY2, nRepStartX,nDataY,
2289cdf0e10cSrcweir 						sal_True,!bDoRepRow,sal_False,sal_True );
2290cdf0e10cSrcweir 		if ( pLocationData )
2291cdf0e10cSrcweir 			LocateArea( nRepeatStartCol,nY1, nRepeatEndCol,nY2, nRepStartX,nDataY, sal_True,sal_False, *pLocationData );
2292cdf0e10cSrcweir 	}
2293cdf0e10cSrcweir 	if (bDoRepRow)
2294cdf0e10cSrcweir 	{
2295cdf0e10cSrcweir 		if ( bDoPrint )
2296cdf0e10cSrcweir 			PrintArea( nX1,nRepeatStartRow, nX2,nRepeatEndRow, nDataX,nRepStartY,
2297cdf0e10cSrcweir 						!bDoRepCol,sal_True,sal_True,sal_False );
2298cdf0e10cSrcweir 		if ( pLocationData )
2299cdf0e10cSrcweir 			LocateArea( nX1,nRepeatStartRow, nX2,nRepeatEndRow, nDataX,nRepStartY, sal_False,sal_True, *pLocationData );
2300cdf0e10cSrcweir 	}
2301cdf0e10cSrcweir 
2302cdf0e10cSrcweir 	//	Daten ausgeben
2303cdf0e10cSrcweir 
2304cdf0e10cSrcweir 	if ( bDoPrint )
2305cdf0e10cSrcweir 		PrintArea( nX1,nY1, nX2,nY2, nDataX,nDataY, !bDoRepCol,!bDoRepRow,sal_True,sal_True );
2306cdf0e10cSrcweir 	if ( pLocationData )
2307cdf0e10cSrcweir 		LocateArea( nX1,nY1, nX2,nY2, nDataX,nDataY, sal_False,sal_False, *pLocationData );
2308cdf0e10cSrcweir 
2309cdf0e10cSrcweir 	//	Spalten-/Zeilenkoepfe ausgeben
2310cdf0e10cSrcweir 	//	nach den Daten (ueber evtl. weitergezeichneten Schatten)
2311cdf0e10cSrcweir 
2312cdf0e10cSrcweir 	Color aGridColor( COL_BLACK );
2313cdf0e10cSrcweir 	if ( bUseStyleColor )
2314cdf0e10cSrcweir         aGridColor.SetColor( SC_MOD()->GetColorConfig().GetColorValue(svtools::FONTCOLOR).nColor );
2315cdf0e10cSrcweir 
2316cdf0e10cSrcweir 	if (aTableParam.bHeaders)
2317cdf0e10cSrcweir 	{
2318cdf0e10cSrcweir 		if ( bDoPrint )
2319cdf0e10cSrcweir 		{
2320cdf0e10cSrcweir 			pDev->SetLineColor( aGridColor );
2321cdf0e10cSrcweir 			pDev->SetFillColor();
2322cdf0e10cSrcweir 			pDev->SetMapMode(aOffsetMode);
2323cdf0e10cSrcweir 		}
2324cdf0e10cSrcweir 
2325cdf0e10cSrcweir 		ScPatternAttr aPattern( pDoc->GetPool() );
2326cdf0e10cSrcweir 		Font aFont;
2327cdf0e10cSrcweir 		ScAutoFontColorMode eColorMode = bUseStyleColor ? SC_AUTOCOL_DISPLAY : SC_AUTOCOL_PRINT;
2328cdf0e10cSrcweir 		aPattern.GetFont( aFont, eColorMode, pDev );
2329cdf0e10cSrcweir 		pDev->SetFont( aFont );
2330cdf0e10cSrcweir 
2331cdf0e10cSrcweir 		if (bDoRepCol)
2332cdf0e10cSrcweir 		{
2333cdf0e10cSrcweir 			if ( bDoPrint )
2334cdf0e10cSrcweir 				PrintColHdr( nRepeatStartCol,nRepeatEndCol, nRepStartX,nInnerStartY );
2335cdf0e10cSrcweir 			if ( pLocationData )
2336cdf0e10cSrcweir 				LocateColHdr( nRepeatStartCol,nRepeatEndCol, nRepStartX,nInnerStartY, sal_True, *pLocationData );
2337cdf0e10cSrcweir 		}
2338cdf0e10cSrcweir 		if ( bDoPrint )
2339cdf0e10cSrcweir 			PrintColHdr( nX1,nX2, nDataX,nInnerStartY );
2340cdf0e10cSrcweir 		if ( pLocationData )
2341cdf0e10cSrcweir 			LocateColHdr( nX1,nX2, nDataX,nInnerStartY, sal_False, *pLocationData );
2342cdf0e10cSrcweir 		if (bDoRepRow)
2343cdf0e10cSrcweir 		{
2344cdf0e10cSrcweir 			if ( bDoPrint )
2345cdf0e10cSrcweir 				PrintRowHdr( nRepeatStartRow,nRepeatEndRow, nInnerStartX,nRepStartY );
2346cdf0e10cSrcweir 			if ( pLocationData )
2347cdf0e10cSrcweir 				LocateRowHdr( nRepeatStartRow,nRepeatEndRow, nInnerStartX,nRepStartY, sal_True, *pLocationData );
2348cdf0e10cSrcweir 		}
2349cdf0e10cSrcweir 		if ( bDoPrint )
2350cdf0e10cSrcweir 			PrintRowHdr( nY1,nY2, nInnerStartX,nDataY );
2351cdf0e10cSrcweir 		if ( pLocationData )
2352cdf0e10cSrcweir 			LocateRowHdr( nY1,nY2, nInnerStartX,nDataY, sal_False, *pLocationData );
2353cdf0e10cSrcweir 	}
2354cdf0e10cSrcweir 
2355cdf0e10cSrcweir 	//	einfacher Rahmen
2356cdf0e10cSrcweir 
2357cdf0e10cSrcweir 	if ( bDoPrint && ( aTableParam.bGrid || aTableParam.bHeaders ) )
2358cdf0e10cSrcweir 	{
2359cdf0e10cSrcweir 		Size aOnePixel = pDev->PixelToLogic(Size(1,1));
2360cdf0e10cSrcweir 		long nOneX = aOnePixel.Width();
2361cdf0e10cSrcweir 		long nOneY = aOnePixel.Height();
2362cdf0e10cSrcweir 
2363cdf0e10cSrcweir 		long nLeftX   = nFrameStartX;
2364cdf0e10cSrcweir 		long nTopY    = nFrameStartY - nOneY;
2365cdf0e10cSrcweir 		long nRightX  = nFrameEndX;
2366cdf0e10cSrcweir 		long nBottomY = nFrameEndY - nOneY;
2367cdf0e10cSrcweir 		if ( !bLayoutRTL )
2368cdf0e10cSrcweir 		{
2369cdf0e10cSrcweir 			nLeftX   -= nOneX;
2370cdf0e10cSrcweir 			nRightX  -= nOneX;
2371cdf0e10cSrcweir 		}
2372cdf0e10cSrcweir 		pDev->SetMapMode(aOffsetMode);
2373cdf0e10cSrcweir 		pDev->SetLineColor( aGridColor );
2374cdf0e10cSrcweir 		pDev->SetFillColor();
2375cdf0e10cSrcweir 		pDev->DrawRect( Rectangle( nLeftX, nTopY, nRightX, nBottomY ) );
2376cdf0e10cSrcweir 		//	nEndX/Y ohne Rahmen-Anpassung
2377cdf0e10cSrcweir 	}
2378cdf0e10cSrcweir 
2379cdf0e10cSrcweir 	if ( pPrinter && bDoPrint )
2380cdf0e10cSrcweir     {
2381cdf0e10cSrcweir         DBG_ERROR( "EndPage does not exist anymore" );
2382cdf0e10cSrcweir 		// pPrinter->EndPage();
2383cdf0e10cSrcweir     }
2384cdf0e10cSrcweir 
2385cdf0e10cSrcweir 	aLastSourceRange = ScRange( nX1, nY1, nPrintTab, nX2, nY2, nPrintTab );
2386cdf0e10cSrcweir 	bSourceRangeValid = sal_True;
2387cdf0e10cSrcweir }
2388cdf0e10cSrcweir 
SetOffset(const Point & rOfs)2389cdf0e10cSrcweir void ScPrintFunc::SetOffset( const Point& rOfs )
2390cdf0e10cSrcweir {
2391cdf0e10cSrcweir 	aSrcOffset = rOfs;
2392cdf0e10cSrcweir }
2393cdf0e10cSrcweir 
SetManualZoom(sal_uInt16 nNewZoom)2394cdf0e10cSrcweir void ScPrintFunc::SetManualZoom( sal_uInt16 nNewZoom )
2395cdf0e10cSrcweir {
2396cdf0e10cSrcweir 	nManualZoom = nNewZoom;
2397cdf0e10cSrcweir }
2398cdf0e10cSrcweir 
SetClearFlag(sal_Bool bFlag)2399cdf0e10cSrcweir void ScPrintFunc::SetClearFlag( sal_Bool bFlag )
2400cdf0e10cSrcweir {
2401cdf0e10cSrcweir 	bClearWin = bFlag;
2402cdf0e10cSrcweir }
2403cdf0e10cSrcweir 
SetUseStyleColor(sal_Bool bFlag)2404cdf0e10cSrcweir void ScPrintFunc::SetUseStyleColor( sal_Bool bFlag )
2405cdf0e10cSrcweir {
2406cdf0e10cSrcweir 	bUseStyleColor = bFlag;
2407cdf0e10cSrcweir 	if (pEditEngine)
2408cdf0e10cSrcweir 		pEditEngine->EnableAutoColor( bUseStyleColor );
2409cdf0e10cSrcweir }
2410cdf0e10cSrcweir 
SetRenderFlag(sal_Bool bFlag)2411cdf0e10cSrcweir void ScPrintFunc::SetRenderFlag( sal_Bool bFlag )
2412cdf0e10cSrcweir {
2413cdf0e10cSrcweir 	bIsRender = bFlag;		// set when using XRenderable (PDF)
2414cdf0e10cSrcweir }
2415cdf0e10cSrcweir 
SetExclusivelyDrawOleAndDrawObjects()2416cdf0e10cSrcweir void ScPrintFunc::SetExclusivelyDrawOleAndDrawObjects()
2417cdf0e10cSrcweir {
2418cdf0e10cSrcweir     aTableParam.bCellContent = false;
2419cdf0e10cSrcweir     aTableParam.bNotes = false;
2420cdf0e10cSrcweir     aTableParam.bGrid = false;
2421cdf0e10cSrcweir     aTableParam.bHeaders = false;
2422cdf0e10cSrcweir     aTableParam.bFormulas = false;
2423cdf0e10cSrcweir     aTableParam.bNullVals = false;
2424cdf0e10cSrcweir }
2425cdf0e10cSrcweir 
2426cdf0e10cSrcweir //
2427cdf0e10cSrcweir //	UpdatePages wird nur von aussen gerufen, um die Umbrueche fuer die Anzeige
2428cdf0e10cSrcweir //	richtig zu setzen - immer ohne UserArea
2429cdf0e10cSrcweir //
2430cdf0e10cSrcweir 
UpdatePages()2431cdf0e10cSrcweir sal_Bool ScPrintFunc::UpdatePages()
2432cdf0e10cSrcweir {
2433cdf0e10cSrcweir 	if (!pParamSet)
2434cdf0e10cSrcweir 		return sal_False;
2435cdf0e10cSrcweir 
2436cdf0e10cSrcweir 	//	Zoom
2437cdf0e10cSrcweir 
2438cdf0e10cSrcweir 	nZoom = 100;
2439cdf0e10cSrcweir     if (aTableParam.bScalePageNum || aTableParam.bScaleTo)
2440cdf0e10cSrcweir 		nZoom = ZOOM_MIN;						// stimmt fuer Umbrueche
2441cdf0e10cSrcweir 	else if (aTableParam.bScaleAll)
2442cdf0e10cSrcweir 	{
2443cdf0e10cSrcweir 		nZoom = aTableParam.nScaleAll;
2444cdf0e10cSrcweir 		if ( nZoom <= ZOOM_MIN )
2445cdf0e10cSrcweir 			nZoom = ZOOM_MIN;
2446cdf0e10cSrcweir 	}
2447cdf0e10cSrcweir 
2448cdf0e10cSrcweir 	String aName = pDoc->GetPageStyle( nPrintTab );
2449cdf0e10cSrcweir 	SCTAB nTabCount = pDoc->GetTableCount();
2450cdf0e10cSrcweir 	for (SCTAB nTab=0; nTab<nTabCount; nTab++)
2451cdf0e10cSrcweir 		if ( nTab==nPrintTab || pDoc->GetPageStyle(nTab)==aName )
2452cdf0e10cSrcweir 		{
2453cdf0e10cSrcweir 			//	Wiederholungszeilen / Spalten
2454cdf0e10cSrcweir 			pDoc->SetRepeatArea( nTab, nRepeatStartCol,nRepeatEndCol, nRepeatStartRow,nRepeatEndRow );
2455cdf0e10cSrcweir 
2456cdf0e10cSrcweir 			//	Umbrueche setzen
2457cdf0e10cSrcweir 			ResetBreaks(nTab);
2458cdf0e10cSrcweir 			pDocShell->PostPaint(0,0,nTab, MAXCOL,MAXROW,nTab, PAINT_GRID);
2459cdf0e10cSrcweir 		}
2460cdf0e10cSrcweir 
2461cdf0e10cSrcweir 	return sal_True;
2462cdf0e10cSrcweir }
2463cdf0e10cSrcweir 
CountPages()2464cdf0e10cSrcweir long ScPrintFunc::CountPages()							// setzt auch nPagesX, nPagesY
2465cdf0e10cSrcweir {
2466cdf0e10cSrcweir 	sal_Bool bAreaOk = sal_False;
2467cdf0e10cSrcweir 
2468cdf0e10cSrcweir 	if (pDoc->HasTable( nPrintTab ))
2469cdf0e10cSrcweir 	{
2470cdf0e10cSrcweir 		if (aAreaParam.bPrintArea)							// Druckbereich angegeben?
2471cdf0e10cSrcweir 		{
2472cdf0e10cSrcweir 			if ( bPrintCurrentTable )
2473cdf0e10cSrcweir 			{
2474cdf0e10cSrcweir 				ScRange& rRange = aAreaParam.aPrintArea;
2475cdf0e10cSrcweir 
2476cdf0e10cSrcweir 				//	hier kein Vergleich der Tabellen mehr, die Area gilt immer fuer diese Tabelle
2477cdf0e10cSrcweir 				//	wenn hier verglichen werden soll, muss die Tabelle der Druckbereiche beim
2478cdf0e10cSrcweir 				//	Einfuegen von Tabellen etc. angepasst werden !
2479cdf0e10cSrcweir 
2480cdf0e10cSrcweir 				nStartCol = rRange.aStart.Col();
2481cdf0e10cSrcweir 				nStartRow = rRange.aStart.Row();
2482cdf0e10cSrcweir 				nEndCol   = rRange.aEnd  .Col();
2483cdf0e10cSrcweir 				nEndRow   = rRange.aEnd  .Row();
2484cdf0e10cSrcweir 				bAreaOk   = AdjustPrintArea(sal_False);			// begrenzen
2485cdf0e10cSrcweir 			}
2486cdf0e10cSrcweir 			else
2487cdf0e10cSrcweir 				bAreaOk = sal_False;
2488cdf0e10cSrcweir 		}
2489cdf0e10cSrcweir 		else												// aus Dokument suchen
2490cdf0e10cSrcweir 			bAreaOk = AdjustPrintArea(sal_True);
2491cdf0e10cSrcweir 	}
2492cdf0e10cSrcweir 
2493cdf0e10cSrcweir 	if (bAreaOk)
2494cdf0e10cSrcweir 	{
2495cdf0e10cSrcweir 		long nPages = 0;
2496cdf0e10cSrcweir 		size_t nY;
2497cdf0e10cSrcweir 		if (bMultiArea)
2498cdf0e10cSrcweir 		{
2499cdf0e10cSrcweir 			sal_uInt16 nRCount = pDoc->GetPrintRangeCount( nPrintTab );
2500cdf0e10cSrcweir 			for (sal_uInt16 i=0; i<nRCount; i++)
2501cdf0e10cSrcweir 			{
2502cdf0e10cSrcweir 				CalcZoom(i);
2503cdf0e10cSrcweir 				if ( aTableParam.bSkipEmpty )
2504cdf0e10cSrcweir 					for (nY=0; nY<nPagesY; nY++)
2505*590a31a1SArmin Le Grand                     {
2506*590a31a1SArmin Le Grand                         OSL_ENSURE(nY < maPageRows.size(), "vector access error for maPageRows (!)");
2507*590a31a1SArmin Le Grand                         nPages += maPageRows[nY].CountVisible();
2508*590a31a1SArmin Le Grand                     }
2509cdf0e10cSrcweir 				else
2510cdf0e10cSrcweir 					nPages += ((long) nPagesX) * nPagesY;
2511cdf0e10cSrcweir 				if ( pPageData )
2512cdf0e10cSrcweir 					FillPageData();
2513cdf0e10cSrcweir 			}
2514cdf0e10cSrcweir 		}
2515cdf0e10cSrcweir 		else
2516cdf0e10cSrcweir 		{
2517cdf0e10cSrcweir 			CalcZoom(RANGENO_NORANGE);						// Zoom berechnen
2518cdf0e10cSrcweir 			if ( aTableParam.bSkipEmpty )
2519cdf0e10cSrcweir 				for (nY=0; nY<nPagesY; nY++)
2520*590a31a1SArmin Le Grand                 {
2521*590a31a1SArmin Le Grand                     OSL_ENSURE(nY < maPageRows.size(), "vector access error for maPageRows (!)");
2522*590a31a1SArmin Le Grand                     nPages += maPageRows[nY].CountVisible();
2523*590a31a1SArmin Le Grand                 }
2524cdf0e10cSrcweir 			else
2525cdf0e10cSrcweir 				nPages += ((long) nPagesX) * nPagesY;
2526cdf0e10cSrcweir 			if ( pPageData )
2527cdf0e10cSrcweir 				FillPageData();
2528cdf0e10cSrcweir 		}
2529cdf0e10cSrcweir 		return nPages;
2530cdf0e10cSrcweir 	}
2531cdf0e10cSrcweir 	else
2532cdf0e10cSrcweir 	{
2533cdf0e10cSrcweir //		nZoom = 100;						// nZoom auf letztem Wert stehenlassen !!!
2534cdf0e10cSrcweir 		nPagesX = nPagesY = nTotalY = 0;
2535cdf0e10cSrcweir 		return 0;
2536cdf0e10cSrcweir 	}
2537cdf0e10cSrcweir }
2538cdf0e10cSrcweir 
CountNotePages()2539cdf0e10cSrcweir long ScPrintFunc::CountNotePages()
2540cdf0e10cSrcweir {
2541cdf0e10cSrcweir 	if ( !aTableParam.bNotes || !bPrintCurrentTable )
2542cdf0e10cSrcweir 		return 0;
2543cdf0e10cSrcweir 
2544cdf0e10cSrcweir 	long nCount=0;
2545cdf0e10cSrcweir 	SCCOL nCol;
2546cdf0e10cSrcweir 	SCROW nRow;
2547cdf0e10cSrcweir 
2548cdf0e10cSrcweir 	sal_Bool bError = sal_False;
2549cdf0e10cSrcweir 	if (!aAreaParam.bPrintArea)
2550cdf0e10cSrcweir 		bError = !AdjustPrintArea(sal_True);			// komplett aus Dok suchen
2551cdf0e10cSrcweir 
2552cdf0e10cSrcweir 	sal_uInt16 nRepeats = 1;							// wie oft durchgehen ?
2553cdf0e10cSrcweir 	if (bMultiArea)
2554cdf0e10cSrcweir 		nRepeats = pDoc->GetPrintRangeCount(nPrintTab);
2555cdf0e10cSrcweir 	if (bError)
2556cdf0e10cSrcweir 		nRepeats = 0;
2557cdf0e10cSrcweir 
2558cdf0e10cSrcweir 	for (sal_uInt16 nStep=0; nStep<nRepeats; nStep++)
2559cdf0e10cSrcweir 	{
2560cdf0e10cSrcweir 		sal_Bool bDoThis = sal_True;
2561cdf0e10cSrcweir 		if (bMultiArea)				// alle Areas durchgehen
2562cdf0e10cSrcweir 		{
2563cdf0e10cSrcweir 			const ScRange* pThisRange = pDoc->GetPrintRange( nPrintTab, nStep );
2564cdf0e10cSrcweir 			if ( pThisRange )
2565cdf0e10cSrcweir 			{
2566cdf0e10cSrcweir 				nStartCol = pThisRange->aStart.Col();
2567cdf0e10cSrcweir 				nStartRow = pThisRange->aStart.Row();
2568cdf0e10cSrcweir 				nEndCol   = pThisRange->aEnd  .Col();
2569cdf0e10cSrcweir 				nEndRow   = pThisRange->aEnd  .Row();
2570cdf0e10cSrcweir 				bDoThis = AdjustPrintArea(sal_False);
2571cdf0e10cSrcweir 			}
2572cdf0e10cSrcweir 		}
2573cdf0e10cSrcweir 
2574cdf0e10cSrcweir 		if (bDoThis)
2575cdf0e10cSrcweir 		{
2576cdf0e10cSrcweir 			ScHorizontalCellIterator aIter( pDoc, nPrintTab, nStartCol,nStartRow, nEndCol,nEndRow );
2577cdf0e10cSrcweir 			ScBaseCell* pCell = aIter.GetNext( nCol, nRow );
2578cdf0e10cSrcweir 			while (pCell)
2579cdf0e10cSrcweir 			{
2580cdf0e10cSrcweir                 if (pCell->HasNote())
2581cdf0e10cSrcweir 				{
2582cdf0e10cSrcweir 					aNotePosList.Insert( new ScAddress( nCol,nRow,nPrintTab ), LIST_APPEND );
2583cdf0e10cSrcweir 					++nCount;
2584cdf0e10cSrcweir 				}
2585cdf0e10cSrcweir 
2586cdf0e10cSrcweir 				pCell = aIter.GetNext( nCol, nRow );
2587cdf0e10cSrcweir 			}
2588cdf0e10cSrcweir 		}
2589cdf0e10cSrcweir 	}
2590cdf0e10cSrcweir 
2591cdf0e10cSrcweir 	long nPages = 0;
2592cdf0e10cSrcweir 	long nNoteNr = 0;
2593cdf0e10cSrcweir 	long nNoteAdd;
2594cdf0e10cSrcweir 	do
2595cdf0e10cSrcweir 	{
2596cdf0e10cSrcweir 		nNoteAdd = PrintNotes( nPages, nNoteNr, sal_False, NULL );
2597cdf0e10cSrcweir 		if (nNoteAdd)
2598cdf0e10cSrcweir 		{
2599cdf0e10cSrcweir 			nNoteNr += nNoteAdd;
2600cdf0e10cSrcweir 			++nPages;
2601cdf0e10cSrcweir 		}
2602cdf0e10cSrcweir 	}
2603cdf0e10cSrcweir 	while (nNoteAdd);
2604cdf0e10cSrcweir 
2605cdf0e10cSrcweir 	return nPages;
2606cdf0e10cSrcweir }
2607cdf0e10cSrcweir 
InitModes()2608cdf0e10cSrcweir void ScPrintFunc::InitModes()				// aus nZoom etc. die MapModes setzen
2609cdf0e10cSrcweir {
2610cdf0e10cSrcweir 	aOffset = Point( aSrcOffset.X()*100/nZoom, aSrcOffset.Y()*100/nZoom );
2611cdf0e10cSrcweir 
2612cdf0e10cSrcweir 	long nEffZoom = nZoom * (long) nManualZoom;
2613cdf0e10cSrcweir 
2614cdf0e10cSrcweir //	nScaleX = nScaleY = 1.0;			// Ausgabe in Twips
2615cdf0e10cSrcweir 	nScaleX = nScaleY = HMM_PER_TWIPS;	// Ausgabe in 1/100 mm
2616cdf0e10cSrcweir 
2617cdf0e10cSrcweir 	Fraction aZoomFract( nEffZoom,10000 );
2618cdf0e10cSrcweir 	Fraction aHorFract = aZoomFract;
2619cdf0e10cSrcweir 
2620cdf0e10cSrcweir 	if ( !pPrinter && !bIsRender )							// adjust scale for preview
2621cdf0e10cSrcweir 	{
2622cdf0e10cSrcweir 		double nFact = pDocShell->GetOutputFactor();
2623cdf0e10cSrcweir 		aHorFract = Fraction( (long)( nEffZoom / nFact ), 10000 );
2624cdf0e10cSrcweir 	}
2625cdf0e10cSrcweir 
2626cdf0e10cSrcweir 	aLogicMode = MapMode( MAP_100TH_MM, Point(), aHorFract, aZoomFract );
2627cdf0e10cSrcweir 
2628cdf0e10cSrcweir 	Point aLogicOfs( -aOffset.X(), -aOffset.Y() );
2629cdf0e10cSrcweir 	aOffsetMode = MapMode( MAP_100TH_MM, aLogicOfs, aHorFract, aZoomFract );
2630cdf0e10cSrcweir 
2631cdf0e10cSrcweir 	Point aTwipsOfs( (long) ( -aOffset.X() / nScaleX + 0.5 ), (long) ( -aOffset.Y() / nScaleY + 0.5 ) );
2632cdf0e10cSrcweir 	aTwipMode = MapMode( MAP_TWIP, aTwipsOfs, aHorFract, aZoomFract );
2633cdf0e10cSrcweir }
2634cdf0e10cSrcweir 
2635cdf0e10cSrcweir //--------------------------------------------------------------------
2636cdf0e10cSrcweir 
ApplyPrintSettings()2637cdf0e10cSrcweir void ScPrintFunc::ApplyPrintSettings()
2638cdf0e10cSrcweir {
2639cdf0e10cSrcweir 	if ( pPrinter )
2640cdf0e10cSrcweir 	{
2641cdf0e10cSrcweir 		//
2642cdf0e10cSrcweir 		//	Printer zum Drucken umstellen
2643cdf0e10cSrcweir 		//
2644cdf0e10cSrcweir 
2645cdf0e10cSrcweir 		Size aEnumSize = aPageSize;
2646cdf0e10cSrcweir 
2647cdf0e10cSrcweir 
2648cdf0e10cSrcweir         pPrinter->SetOrientation( bLandscape ? ORIENTATION_LANDSCAPE : ORIENTATION_PORTRAIT );
2649cdf0e10cSrcweir         if ( bLandscape )
2650cdf0e10cSrcweir         {
2651cdf0e10cSrcweir                 // landscape is always interpreted as a rotation by 90 degrees !
2652cdf0e10cSrcweir                 // this leads to non WYSIWIG but at least it prints!
2653cdf0e10cSrcweir                 // #i21775#
2654cdf0e10cSrcweir                 long nTemp = aEnumSize.Width();
2655cdf0e10cSrcweir                 aEnumSize.Width() = aEnumSize.Height();
2656cdf0e10cSrcweir                 aEnumSize.Height() = nTemp;
2657cdf0e10cSrcweir         }
2658cdf0e10cSrcweir         Paper ePaper = SvxPaperInfo::GetSvxPaper( aEnumSize, MAP_TWIP, sal_True );
2659cdf0e10cSrcweir 		sal_uInt16 nPaperBin = ((const SvxPaperBinItem&)pParamSet->Get(ATTR_PAGE_PAPERBIN)).GetValue();
2660cdf0e10cSrcweir 
2661cdf0e10cSrcweir         pPrinter->SetPaper( ePaper );
2662cdf0e10cSrcweir         if ( PAPER_USER == ePaper )
2663cdf0e10cSrcweir         {
2664cdf0e10cSrcweir 		    MapMode aPrinterMode = pPrinter->GetMapMode();
2665cdf0e10cSrcweir 		    MapMode aLocalMode( MAP_TWIP );
2666cdf0e10cSrcweir 		    pPrinter->SetMapMode( aLocalMode );
2667cdf0e10cSrcweir 		    pPrinter->SetPaperSizeUser( aEnumSize );
2668cdf0e10cSrcweir 		    pPrinter->SetMapMode( aPrinterMode );
2669cdf0e10cSrcweir         }
2670cdf0e10cSrcweir 
2671cdf0e10cSrcweir 		pPrinter->SetPaperBin( nPaperBin );
2672cdf0e10cSrcweir 	}
2673cdf0e10cSrcweir }
2674cdf0e10cSrcweir 
2675cdf0e10cSrcweir //--------------------------------------------------------------------
2676cdf0e10cSrcweir //	rPageRanges   = Range fuer alle Tabellen
2677cdf0e10cSrcweir //	nStartPage	  = in rPageRanges beginnen bei nStartPage
2678cdf0e10cSrcweir //	nDisplayStart = lfd. Nummer fuer Anzeige der Seitennummer
2679cdf0e10cSrcweir 
DoPrint(const MultiSelection & rPageRanges,long nStartPage,long nDisplayStart,sal_Bool bDoPrint,ScPreviewLocationData * pLocationData)2680cdf0e10cSrcweir long ScPrintFunc::DoPrint( const MultiSelection& rPageRanges,
2681cdf0e10cSrcweir 								long nStartPage, long nDisplayStart, sal_Bool bDoPrint,
2682cdf0e10cSrcweir                                 ScPreviewLocationData* pLocationData )
2683cdf0e10cSrcweir {
2684cdf0e10cSrcweir 	DBG_ASSERT(pDev,"Device == NULL");
2685cdf0e10cSrcweir 	if (!pParamSet)
2686cdf0e10cSrcweir 		return 0;
2687cdf0e10cSrcweir 
2688cdf0e10cSrcweir 	if ( pPrinter && bDoPrint )
2689cdf0e10cSrcweir 		ApplyPrintSettings();
2690cdf0e10cSrcweir 
2691cdf0e10cSrcweir 	//--------------------------------------------------------------------
2692cdf0e10cSrcweir 
2693cdf0e10cSrcweir 	InitModes();
2694cdf0e10cSrcweir 	if ( pLocationData )
2695cdf0e10cSrcweir 	{
2696cdf0e10cSrcweir 		pLocationData->SetCellMapMode( aOffsetMode );
2697cdf0e10cSrcweir 		pLocationData->SetPrintTab( nPrintTab );
2698cdf0e10cSrcweir 	}
2699cdf0e10cSrcweir 
2700cdf0e10cSrcweir 	MakeTableString();
2701cdf0e10cSrcweir 
2702cdf0e10cSrcweir 	//--------------------------------------------------------------------
2703cdf0e10cSrcweir 
2704cdf0e10cSrcweir 	long nPageNo = 0;
2705cdf0e10cSrcweir 	long nPrinted = 0;
2706cdf0e10cSrcweir 	long nEndPage = rPageRanges.GetTotalRange().Max();
2707cdf0e10cSrcweir 
2708cdf0e10cSrcweir 	sal_uInt16 nRepeats = 1;					// wie oft durchgehen ?
2709cdf0e10cSrcweir 	if (bMultiArea)
2710cdf0e10cSrcweir 		nRepeats = pDoc->GetPrintRangeCount(nPrintTab);
2711cdf0e10cSrcweir 	for (sal_uInt16 nStep=0; nStep<nRepeats; nStep++)
2712cdf0e10cSrcweir 	{
2713cdf0e10cSrcweir 		if (bMultiArea)						// Bereich neu belegen ?
2714cdf0e10cSrcweir 		{
2715cdf0e10cSrcweir 			CalcZoom(nStep);				// setzt auch nStartCol etc. neu
2716cdf0e10cSrcweir 			InitModes();
2717cdf0e10cSrcweir 		}
2718cdf0e10cSrcweir 
2719cdf0e10cSrcweir 		SCCOL nX1;
2720cdf0e10cSrcweir 		SCROW nY1;
2721cdf0e10cSrcweir 		SCCOL nX2;
2722cdf0e10cSrcweir 		SCROW nY2;
2723cdf0e10cSrcweir 		size_t nCountX;
2724cdf0e10cSrcweir 		size_t nCountY;
2725cdf0e10cSrcweir 
2726cdf0e10cSrcweir 		if (aTableParam.bTopDown)							// von oben nach unten
2727cdf0e10cSrcweir 		{
2728cdf0e10cSrcweir 			nX1 = nStartCol;
2729cdf0e10cSrcweir 			for (nCountX=0; nCountX<nPagesX; nCountX++)
2730cdf0e10cSrcweir 			{
2731*590a31a1SArmin Le Grand                 OSL_ENSURE(nCountX < maPageEndX.size(), "vector access error for maPageEndX (!)");
2732*590a31a1SArmin Le Grand 				nX2 = maPageEndX[nCountX];
2733cdf0e10cSrcweir 				for (nCountY=0; nCountY<nPagesY; nCountY++)
2734cdf0e10cSrcweir 				{
2735*590a31a1SArmin Le Grand                     OSL_ENSURE(nCountY < maPageRows.size(), "vector access error for maPageRows (!)");
2736*590a31a1SArmin Le Grand 					nY1 = maPageRows[nCountY].GetStartRow();
2737*590a31a1SArmin Le Grand 					nY2 = maPageRows[nCountY].GetEndRow();
2738*590a31a1SArmin Le Grand 					if ( !aTableParam.bSkipEmpty || !maPageRows[nCountY].IsHidden(nCountX) )
2739cdf0e10cSrcweir 					{
2740cdf0e10cSrcweir 						if ( rPageRanges.IsSelected( nPageNo+nStartPage+1 ) )
2741cdf0e10cSrcweir 						{
2742cdf0e10cSrcweir 							PrintPage( nPageNo+nDisplayStart, nX1, nY1, nX2, nY2,
2743cdf0e10cSrcweir 										bDoPrint, pLocationData );
2744cdf0e10cSrcweir 							++nPrinted;
2745cdf0e10cSrcweir 						}
2746cdf0e10cSrcweir 						++nPageNo;
2747cdf0e10cSrcweir 					}
2748cdf0e10cSrcweir 				}
2749cdf0e10cSrcweir 				nX1 = nX2 + 1;
2750cdf0e10cSrcweir 			}
2751cdf0e10cSrcweir 		}
2752cdf0e10cSrcweir 		else												// von links nach rechts
2753cdf0e10cSrcweir 		{
2754cdf0e10cSrcweir 			for (nCountY=0; nCountY<nPagesY; nCountY++)
2755cdf0e10cSrcweir 			{
2756*590a31a1SArmin Le Grand                 OSL_ENSURE(nCountY < maPageRows.size(), "vector access error for maPageRows (!)");
2757*590a31a1SArmin Le Grand 				nY1 = maPageRows[nCountY].GetStartRow();
2758*590a31a1SArmin Le Grand 				nY2 = maPageRows[nCountY].GetEndRow();
2759cdf0e10cSrcweir 				nX1 = nStartCol;
2760cdf0e10cSrcweir 				for (nCountX=0; nCountX<nPagesX; nCountX++)
2761cdf0e10cSrcweir 				{
2762*590a31a1SArmin Le Grand                     OSL_ENSURE(nCountX < maPageEndX.size(), "vector access error for maPageEndX (!)");
2763*590a31a1SArmin Le Grand 					nX2 = maPageEndX[nCountX];
2764*590a31a1SArmin Le Grand 					if ( !aTableParam.bSkipEmpty || !maPageRows[nCountY].IsHidden(nCountX) )
2765cdf0e10cSrcweir 					{
2766cdf0e10cSrcweir 						if ( rPageRanges.IsSelected( nPageNo+nStartPage+1 ) )
2767cdf0e10cSrcweir 						{
2768cdf0e10cSrcweir 							PrintPage( nPageNo+nDisplayStart, nX1, nY1, nX2, nY2,
2769cdf0e10cSrcweir 										bDoPrint, pLocationData );
2770cdf0e10cSrcweir 							++nPrinted;
2771cdf0e10cSrcweir 						}
2772cdf0e10cSrcweir 						++nPageNo;
2773cdf0e10cSrcweir 					}
2774cdf0e10cSrcweir 					nX1 = nX2 + 1;
2775cdf0e10cSrcweir 				}
2776cdf0e10cSrcweir 			}
2777cdf0e10cSrcweir 		}
2778cdf0e10cSrcweir 	}
2779cdf0e10cSrcweir 
2780cdf0e10cSrcweir 	aFieldData.aTabName = ScGlobal::GetRscString( STR_NOTES );
2781cdf0e10cSrcweir 
2782cdf0e10cSrcweir 	long nNoteNr = 0;
2783cdf0e10cSrcweir 	long nNoteAdd;
2784cdf0e10cSrcweir 	do
2785cdf0e10cSrcweir 	{
2786cdf0e10cSrcweir 		if ( nPageNo+nStartPage <= nEndPage )
2787cdf0e10cSrcweir 		{
2788cdf0e10cSrcweir 			sal_Bool bPageSelected = rPageRanges.IsSelected( nPageNo+nStartPage+1 );
2789cdf0e10cSrcweir 			nNoteAdd = PrintNotes( nPageNo+nStartPage, nNoteNr, bDoPrint && bPageSelected,
2790cdf0e10cSrcweir 									( bPageSelected ? pLocationData : NULL ) );
2791cdf0e10cSrcweir 			if ( nNoteAdd )
2792cdf0e10cSrcweir 			{
2793cdf0e10cSrcweir 				nNoteNr += nNoteAdd;
2794cdf0e10cSrcweir 				if (bPageSelected)
2795cdf0e10cSrcweir 				{
2796cdf0e10cSrcweir 					++nPrinted;
2797cdf0e10cSrcweir 					bSourceRangeValid = sal_False;		// last page was no cell range
2798cdf0e10cSrcweir 				}
2799cdf0e10cSrcweir 				++nPageNo;
2800cdf0e10cSrcweir 			}
2801cdf0e10cSrcweir 		}
2802cdf0e10cSrcweir 		else
2803cdf0e10cSrcweir 			nNoteAdd = 0;
2804cdf0e10cSrcweir 	}
2805cdf0e10cSrcweir 	while (nNoteAdd);
2806cdf0e10cSrcweir 
2807cdf0e10cSrcweir 	if ( bMultiArea )
2808cdf0e10cSrcweir 		ResetBreaks(nPrintTab);							// Breaks fuer Anzeige richtig
2809cdf0e10cSrcweir 
2810cdf0e10cSrcweir 	return nPrinted;
2811cdf0e10cSrcweir }
2812cdf0e10cSrcweir 
CalcZoom(sal_uInt16 nRangeNo)2813cdf0e10cSrcweir void ScPrintFunc::CalcZoom( sal_uInt16 nRangeNo )						// Zoom berechnen
2814cdf0e10cSrcweir {
2815cdf0e10cSrcweir 	sal_uInt16 nRCount = pDoc->GetPrintRangeCount( nPrintTab );
2816cdf0e10cSrcweir 	const ScRange* pThisRange = NULL;
2817cdf0e10cSrcweir 	if ( nRangeNo != RANGENO_NORANGE || nRangeNo < nRCount )
2818cdf0e10cSrcweir 		pThisRange = pDoc->GetPrintRange( nPrintTab, nRangeNo );
2819cdf0e10cSrcweir 	if ( pThisRange )
2820cdf0e10cSrcweir 	{
2821cdf0e10cSrcweir 		nStartCol = pThisRange->aStart.Col();
2822cdf0e10cSrcweir 		nStartRow = pThisRange->aStart.Row();
2823cdf0e10cSrcweir 		nEndCol   = pThisRange->aEnd  .Col();
2824cdf0e10cSrcweir 		nEndRow   = pThisRange->aEnd  .Row();
2825cdf0e10cSrcweir 	}
2826cdf0e10cSrcweir 
2827cdf0e10cSrcweir 	if (!AdjustPrintArea(sal_False))						// leer
2828cdf0e10cSrcweir 	{
2829cdf0e10cSrcweir 		nZoom = 100;
2830cdf0e10cSrcweir 		nPagesX = nPagesY = nTotalY = 0;
2831cdf0e10cSrcweir 		return;
2832cdf0e10cSrcweir 	}
2833cdf0e10cSrcweir 
2834cdf0e10cSrcweir 	pDoc->SetRepeatArea( nPrintTab, nRepeatStartCol,nRepeatEndCol, nRepeatStartRow,nRepeatEndRow );
2835cdf0e10cSrcweir 
2836cdf0e10cSrcweir 	if (aTableParam.bScalePageNum)
2837cdf0e10cSrcweir 	{
2838cdf0e10cSrcweir 		nZoom = 100;
2839cdf0e10cSrcweir 		sal_uInt16 nPagesToFit = aTableParam.nScalePageNum;
2840cdf0e10cSrcweir 
2841cdf0e10cSrcweir         sal_uInt16 nLastFitZoom = 0, nLastNonFitZoom = 0;
2842cdf0e10cSrcweir         while (true)
2843cdf0e10cSrcweir         {
2844cdf0e10cSrcweir             if (nZoom <= ZOOM_MIN)
2845cdf0e10cSrcweir                 break;
2846cdf0e10cSrcweir 
2847cdf0e10cSrcweir             CalcPages();
2848cdf0e10cSrcweir             bool bFitsPage = (nPagesX * nPagesY <= nPagesToFit);
2849cdf0e10cSrcweir 
2850cdf0e10cSrcweir             if (bFitsPage)
2851cdf0e10cSrcweir             {
2852cdf0e10cSrcweir                 if (nZoom == 100)
2853cdf0e10cSrcweir                     // If it fits at 100 %, it's good enough for me.
2854cdf0e10cSrcweir                     break;
2855cdf0e10cSrcweir 
2856cdf0e10cSrcweir                 nLastFitZoom = nZoom;
2857cdf0e10cSrcweir                 nZoom = (nLastNonFitZoom + nZoom) / 2;
2858cdf0e10cSrcweir 
2859cdf0e10cSrcweir                 if (nLastFitZoom == nZoom)
2860cdf0e10cSrcweir                     // It converged.  Use this zoom level.
2861cdf0e10cSrcweir                     break;
2862cdf0e10cSrcweir             }
2863cdf0e10cSrcweir             else
2864cdf0e10cSrcweir             {
2865cdf0e10cSrcweir                 if (nZoom - nLastFitZoom <= 1)
2866cdf0e10cSrcweir                 {
2867cdf0e10cSrcweir                     nZoom = nLastFitZoom;
2868cdf0e10cSrcweir                     CalcPages();
2869cdf0e10cSrcweir                     break;
2870cdf0e10cSrcweir                 }
2871cdf0e10cSrcweir 
2872cdf0e10cSrcweir                 nLastNonFitZoom = nZoom;
2873cdf0e10cSrcweir                 nZoom = (nLastFitZoom + nZoom) / 2;
2874cdf0e10cSrcweir             }
2875cdf0e10cSrcweir         }
2876cdf0e10cSrcweir 	}
2877cdf0e10cSrcweir     else if (aTableParam.bScaleTo)
2878cdf0e10cSrcweir     {
2879cdf0e10cSrcweir         nZoom = 100;
2880cdf0e10cSrcweir         sal_uInt16 nW = aTableParam.nScaleWidth;
2881cdf0e10cSrcweir         sal_uInt16 nH = aTableParam.nScaleHeight;
2882cdf0e10cSrcweir 
2883cdf0e10cSrcweir         sal_uInt16 nLastFitZoom = 0, nLastNonFitZoom = 0;
2884cdf0e10cSrcweir         while (true)
2885cdf0e10cSrcweir         {
2886cdf0e10cSrcweir             if (nZoom <= ZOOM_MIN)
2887cdf0e10cSrcweir                 break;
2888cdf0e10cSrcweir 
2889cdf0e10cSrcweir             CalcPages();
2890cdf0e10cSrcweir             bool bFitsPage = ((!nW || (nPagesX <= nW)) && (!nH || (nPagesY <= nH)));
2891cdf0e10cSrcweir 
2892cdf0e10cSrcweir             if (bFitsPage)
2893cdf0e10cSrcweir             {
2894cdf0e10cSrcweir                 if (nZoom == 100)
2895cdf0e10cSrcweir                     // If it fits at 100 %, it's good enough for me.
2896cdf0e10cSrcweir                     break;
2897cdf0e10cSrcweir 
2898cdf0e10cSrcweir                 nLastFitZoom = nZoom;
2899cdf0e10cSrcweir                 nZoom = (nLastNonFitZoom + nZoom) / 2;
2900cdf0e10cSrcweir 
2901cdf0e10cSrcweir                 if (nLastFitZoom == nZoom)
2902cdf0e10cSrcweir                     // It converged.  Use this zoom level.
2903cdf0e10cSrcweir                     break;
2904cdf0e10cSrcweir             }
2905cdf0e10cSrcweir             else
2906cdf0e10cSrcweir             {
2907cdf0e10cSrcweir                 if (nZoom - nLastFitZoom <= 1)
2908cdf0e10cSrcweir                 {
2909cdf0e10cSrcweir                     nZoom = nLastFitZoom;
2910cdf0e10cSrcweir                     CalcPages();
2911cdf0e10cSrcweir                     break;
2912cdf0e10cSrcweir                 }
2913cdf0e10cSrcweir 
2914cdf0e10cSrcweir                 nLastNonFitZoom = nZoom;
2915cdf0e10cSrcweir                 nZoom = (nLastFitZoom + nZoom) / 2;
2916cdf0e10cSrcweir             }
2917cdf0e10cSrcweir         }
2918cdf0e10cSrcweir     }
2919cdf0e10cSrcweir 	else if (aTableParam.bScaleAll)
2920cdf0e10cSrcweir 	{
2921cdf0e10cSrcweir 		nZoom = aTableParam.nScaleAll;
2922cdf0e10cSrcweir 		if ( nZoom <= ZOOM_MIN )
2923cdf0e10cSrcweir 			nZoom = ZOOM_MIN;
2924cdf0e10cSrcweir 		CalcPages();
2925cdf0e10cSrcweir 	}
2926cdf0e10cSrcweir 	else
2927cdf0e10cSrcweir 	{
2928cdf0e10cSrcweir 		DBG_ASSERT( aTableParam.bScaleNone, "kein Scale-Flag gesetzt" );
2929cdf0e10cSrcweir 		nZoom = 100;
2930cdf0e10cSrcweir 		CalcPages();
2931cdf0e10cSrcweir 	}
2932cdf0e10cSrcweir }
2933cdf0e10cSrcweir 
GetDocPageSize()2934cdf0e10cSrcweir Size ScPrintFunc::GetDocPageSize()
2935cdf0e10cSrcweir {
2936cdf0e10cSrcweir 						// Hoehe Kopf-/Fusszeile anpassen
2937cdf0e10cSrcweir 
2938cdf0e10cSrcweir 	InitModes();							// aTwipMode aus nZoom initialisieren
2939cdf0e10cSrcweir 	pDev->SetMapMode( aTwipMode );			// Kopf-/Fusszeilen in Twips
2940cdf0e10cSrcweir 	UpdateHFHeight( aHdr );
2941cdf0e10cSrcweir 	UpdateHFHeight( aFtr );
2942cdf0e10cSrcweir 
2943cdf0e10cSrcweir 						// Seitengroesse in Document-Twips
2944cdf0e10cSrcweir 						// 	Berechnung Left / Right auch in PrintPage
2945cdf0e10cSrcweir 
2946cdf0e10cSrcweir 	aPageRect = Rectangle( Point(), aPageSize );
2947cdf0e10cSrcweir 	aPageRect.Left()   = ( aPageRect.Left()   + nLeftMargin					 ) * 100 / nZoom;
2948cdf0e10cSrcweir 	aPageRect.Right()  = ( aPageRect.Right()  - nRightMargin				 ) * 100 / nZoom;
2949cdf0e10cSrcweir 	aPageRect.Top()    = ( aPageRect.Top()    + nTopMargin    ) * 100 / nZoom + aHdr.nHeight;
2950cdf0e10cSrcweir 	aPageRect.Bottom() = ( aPageRect.Bottom() - nBottomMargin ) * 100 / nZoom - aFtr.nHeight;
2951cdf0e10cSrcweir 
2952cdf0e10cSrcweir 	Size aDocPageSize = aPageRect.GetSize();
2953cdf0e10cSrcweir 	if (aTableParam.bHeaders)
2954cdf0e10cSrcweir 	{
2955cdf0e10cSrcweir 		aDocPageSize.Width()  -= (long) PRINT_HEADER_WIDTH;
2956cdf0e10cSrcweir 		aDocPageSize.Height() -= (long) PRINT_HEADER_HEIGHT;
2957cdf0e10cSrcweir 	}
2958cdf0e10cSrcweir 	if (pBorderItem)
2959cdf0e10cSrcweir 	{
2960cdf0e10cSrcweir 		aDocPageSize.Width()  -= lcl_LineTotal(pBorderItem->GetLeft()) +
2961cdf0e10cSrcweir 								 lcl_LineTotal(pBorderItem->GetRight()) +
2962cdf0e10cSrcweir 								 pBorderItem->GetDistance(BOX_LINE_LEFT) +
2963cdf0e10cSrcweir 								 pBorderItem->GetDistance(BOX_LINE_RIGHT);
2964cdf0e10cSrcweir 		aDocPageSize.Height() -= lcl_LineTotal(pBorderItem->GetTop()) +
2965cdf0e10cSrcweir 								 lcl_LineTotal(pBorderItem->GetBottom()) +
2966cdf0e10cSrcweir 								 pBorderItem->GetDistance(BOX_LINE_TOP) +
2967cdf0e10cSrcweir 								 pBorderItem->GetDistance(BOX_LINE_BOTTOM);
2968cdf0e10cSrcweir 	}
2969cdf0e10cSrcweir 	if (pShadowItem && pShadowItem->GetLocation() != SVX_SHADOW_NONE)
2970cdf0e10cSrcweir 	{
2971cdf0e10cSrcweir 		aDocPageSize.Width()  -= pShadowItem->CalcShadowSpace(SHADOW_LEFT) +
2972cdf0e10cSrcweir 								 pShadowItem->CalcShadowSpace(SHADOW_RIGHT);
2973cdf0e10cSrcweir 		aDocPageSize.Height() -= pShadowItem->CalcShadowSpace(SHADOW_TOP) +
2974cdf0e10cSrcweir 								 pShadowItem->CalcShadowSpace(SHADOW_BOTTOM);
2975cdf0e10cSrcweir 	}
2976cdf0e10cSrcweir 	return aDocPageSize;
2977cdf0e10cSrcweir }
2978cdf0e10cSrcweir 
ResetBreaks(SCTAB nTab)2979cdf0e10cSrcweir void ScPrintFunc::ResetBreaks( SCTAB nTab )			// Breaks fuer Anzeige richtig setzen
2980cdf0e10cSrcweir {
2981cdf0e10cSrcweir 	pDoc->SetPageSize( nTab, GetDocPageSize() );
2982cdf0e10cSrcweir 	pDoc->UpdatePageBreaks( nTab, NULL );
2983cdf0e10cSrcweir }
2984cdf0e10cSrcweir 
lcl_SetHidden(ScDocument * pDoc,SCTAB nPrintTab,ScPageRowEntry & rPageRowEntry,SCCOL nStartCol,const std::vector<SCCOL> & aPageEndX)2985*590a31a1SArmin Le Grand void lcl_SetHidden( ScDocument* pDoc, SCTAB nPrintTab, ScPageRowEntry& rPageRowEntry, SCCOL nStartCol, const std::vector< SCCOL >& aPageEndX)
2986cdf0e10cSrcweir {
2987cdf0e10cSrcweir 	size_t nPagesX   = rPageRowEntry.GetPagesX();
2988cdf0e10cSrcweir 	SCROW nStartRow = rPageRowEntry.GetStartRow();
2989cdf0e10cSrcweir 	SCROW nEndRow   = rPageRowEntry.GetEndRow();
2990cdf0e10cSrcweir 
2991cdf0e10cSrcweir 	sal_Bool bLeftIsEmpty = sal_False;
2992cdf0e10cSrcweir 	ScRange aTempRange;
2993cdf0e10cSrcweir 	Rectangle aTempRect = pDoc->GetMMRect( 0,0, 0,0, 0 );
2994cdf0e10cSrcweir 
2995cdf0e10cSrcweir 	for (size_t i=0; i<nPagesX; i++)
2996cdf0e10cSrcweir 	{
2997*590a31a1SArmin Le Grand         OSL_ENSURE(i < aPageEndX.size(), "vector access error for maPageEndX (!)");
2998*590a31a1SArmin Le Grand 		SCCOL nEndCol = aPageEndX[i];
2999cdf0e10cSrcweir 		if ( pDoc->IsPrintEmpty( nPrintTab, nStartCol, nStartRow, nEndCol, nEndRow,
3000cdf0e10cSrcweir 									bLeftIsEmpty, &aTempRange, &aTempRect ) )
3001cdf0e10cSrcweir 		{
3002cdf0e10cSrcweir 			rPageRowEntry.SetHidden(i);
3003cdf0e10cSrcweir 			bLeftIsEmpty = sal_True;
3004cdf0e10cSrcweir 		}
3005cdf0e10cSrcweir 		else
3006cdf0e10cSrcweir 			bLeftIsEmpty = sal_False;
3007cdf0e10cSrcweir 
3008cdf0e10cSrcweir 		nStartCol = nEndCol+1;
3009cdf0e10cSrcweir 	}
3010cdf0e10cSrcweir }
3011cdf0e10cSrcweir 
CalcPages()3012cdf0e10cSrcweir void ScPrintFunc::CalcPages()               // berechnet aPageRect und Seiten aus nZoom
3013cdf0e10cSrcweir {
3014*590a31a1SArmin Le Grand     // #123672# use dynamic mem to react on size changes
3015*590a31a1SArmin Le Grand     if(maPageEndX.size() < MAXCOL+1)
3016*590a31a1SArmin Le Grand     {
3017*590a31a1SArmin Le Grand         maPageEndX.resize(MAXCOL+1, SCCOL());
3018*590a31a1SArmin Le Grand     }
3019cdf0e10cSrcweir 
3020cdf0e10cSrcweir     pDoc->SetPageSize( nPrintTab, GetDocPageSize() );
3021cdf0e10cSrcweir     if (aAreaParam.bPrintArea)
3022cdf0e10cSrcweir     {
3023cdf0e10cSrcweir         ScRange aRange( nStartCol, nStartRow, nPrintTab, nEndCol, nEndRow, nPrintTab );
3024cdf0e10cSrcweir         pDoc->UpdatePageBreaks( nPrintTab, &aRange );
3025cdf0e10cSrcweir     }
3026cdf0e10cSrcweir     else
3027*590a31a1SArmin Le Grand     {
3028cdf0e10cSrcweir         pDoc->UpdatePageBreaks( nPrintTab, NULL );      // sonst wird das Ende markiert
3029*590a31a1SArmin Le Grand     }
3030*590a31a1SArmin Le Grand 
3031*590a31a1SArmin Le Grand     const SCROW nRealCnt = nEndRow-nStartRow+1;
3032*590a31a1SArmin Le Grand 
3033*590a31a1SArmin Le Grand     // #123672# use dynamic mem to react on size changes
3034*590a31a1SArmin Le Grand     if(maPageEndY.size() < nRealCnt+1)
3035*590a31a1SArmin Le Grand     {
3036*590a31a1SArmin Le Grand         maPageEndY.resize(nRealCnt+1, SCROW());
3037*590a31a1SArmin Le Grand     }
3038*590a31a1SArmin Le Grand 
3039*590a31a1SArmin Le Grand     // #123672# use dynamic mem to react on size changes
3040*590a31a1SArmin Le Grand     if(maPageRows.size() < nRealCnt+1)
3041*590a31a1SArmin Le Grand     {
3042*590a31a1SArmin Le Grand         maPageRows.resize(nRealCnt+1, ScPageRowEntry());
3043*590a31a1SArmin Le Grand     }
3044*590a31a1SArmin Le Grand 
3045cdf0e10cSrcweir     //
3046cdf0e10cSrcweir     //  Seiteneinteilung nach Umbruechen in Col/RowFlags
3047cdf0e10cSrcweir     //  Von mehreren Umbruechen in einem ausgeblendeten Bereich zaehlt nur einer.
3048cdf0e10cSrcweir     //
3049cdf0e10cSrcweir 
3050cdf0e10cSrcweir     nPagesX = 0;
3051cdf0e10cSrcweir     nPagesY = 0;
3052cdf0e10cSrcweir     nTotalY = 0;
3053cdf0e10cSrcweir 
3054cdf0e10cSrcweir     bool bVisCol = false;
3055cdf0e10cSrcweir     SCCOL nLastCol = -1;
3056cdf0e10cSrcweir     for (SCCOL i=nStartCol; i<=nEndCol; i++)
3057cdf0e10cSrcweir     {
3058cdf0e10cSrcweir         bool bHidden = pDoc->ColHidden(i, nPrintTab, nLastCol);
3059cdf0e10cSrcweir         bool bPageBreak = (pDoc->HasColBreak(i, nPrintTab) & BREAK_PAGE);
3060cdf0e10cSrcweir         if ( i>nStartCol && bVisCol && bPageBreak )
3061cdf0e10cSrcweir         {
3062*590a31a1SArmin Le Grand             OSL_ENSURE(nPagesX < maPageEndX.size(), "vector access error for maPageEndX (!)");
3063*590a31a1SArmin Le Grand             maPageEndX[nPagesX] = i-1;
3064cdf0e10cSrcweir             ++nPagesX;
3065cdf0e10cSrcweir             bVisCol = false;
3066cdf0e10cSrcweir         }
3067cdf0e10cSrcweir         if (!bHidden)
3068cdf0e10cSrcweir             bVisCol = true;
3069cdf0e10cSrcweir     }
3070cdf0e10cSrcweir     if (bVisCol)    // auch am Ende keine leeren Seiten
3071cdf0e10cSrcweir     {
3072*590a31a1SArmin Le Grand         OSL_ENSURE(nPagesX < maPageEndX.size(), "vector access error for maPageEndX (!)");
3073*590a31a1SArmin Le Grand         maPageEndX[nPagesX] = nEndCol;
3074cdf0e10cSrcweir         ++nPagesX;
3075cdf0e10cSrcweir     }
3076cdf0e10cSrcweir 
3077cdf0e10cSrcweir     bool bVisRow = false;
3078cdf0e10cSrcweir     SCROW nPageStartRow = nStartRow;
3079cdf0e10cSrcweir     SCROW nLastVisibleRow = -1;
3080cdf0e10cSrcweir 
3081cdf0e10cSrcweir     ::boost::scoped_ptr<ScRowBreakIterator> pRowBreakIter(pDoc->GetRowBreakIterator(nPrintTab));
3082cdf0e10cSrcweir     SCROW nNextPageBreak = pRowBreakIter->first();
3083cdf0e10cSrcweir     while (nNextPageBreak != ScRowBreakIterator::NOT_FOUND && nNextPageBreak < nStartRow)
3084cdf0e10cSrcweir         // Skip until the page break position is at the start row or greater.
3085cdf0e10cSrcweir         nNextPageBreak = pRowBreakIter->next();
3086cdf0e10cSrcweir 
3087cdf0e10cSrcweir     for (SCROW nRow = nStartRow; nRow <= nEndRow; ++nRow)
3088cdf0e10cSrcweir     {
3089cdf0e10cSrcweir         bool bPageBreak = (nNextPageBreak == nRow);
3090cdf0e10cSrcweir         if (bPageBreak)
3091cdf0e10cSrcweir             nNextPageBreak = pRowBreakIter->next();
3092cdf0e10cSrcweir 
3093cdf0e10cSrcweir         if (nRow > nStartRow && bVisRow && bPageBreak )
3094cdf0e10cSrcweir         {
3095*590a31a1SArmin Le Grand             OSL_ENSURE(nTotalY < maPageEndY.size(), "vector access error for maPageEndY (!)");
3096*590a31a1SArmin Le Grand             maPageEndY[nTotalY] = nRow-1;
3097cdf0e10cSrcweir             ++nTotalY;
3098cdf0e10cSrcweir 
3099cdf0e10cSrcweir             if ( !aTableParam.bSkipEmpty ||
3100cdf0e10cSrcweir                     !pDoc->IsPrintEmpty( nPrintTab, nStartCol, nPageStartRow, nEndCol, nRow-1 ) )
3101cdf0e10cSrcweir             {
3102*590a31a1SArmin Le Grand                 OSL_ENSURE(nPagesY < maPageRows.size(), "vector access error for maPageRows (!)");
3103*590a31a1SArmin Le Grand                 maPageRows[nPagesY].SetStartRow( nPageStartRow );
3104*590a31a1SArmin Le Grand                 maPageRows[nPagesY].SetEndRow( nRow-1 );
3105*590a31a1SArmin Le Grand                 maPageRows[nPagesY].SetPagesX( nPagesX );
3106cdf0e10cSrcweir                 if (aTableParam.bSkipEmpty)
3107*590a31a1SArmin Le Grand                     lcl_SetHidden( pDoc, nPrintTab, maPageRows[nPagesY], nStartCol, maPageEndX );
3108cdf0e10cSrcweir                 ++nPagesY;
3109cdf0e10cSrcweir             }
3110cdf0e10cSrcweir 
3111cdf0e10cSrcweir             nPageStartRow = nRow;
3112cdf0e10cSrcweir             bVisRow = false;
3113cdf0e10cSrcweir         }
3114cdf0e10cSrcweir 
3115cdf0e10cSrcweir         if (nRow <= nLastVisibleRow)
3116cdf0e10cSrcweir         {
3117cdf0e10cSrcweir             // This row is still visible.  Don't bother calling RowHidden() to
3118cdf0e10cSrcweir             // find out, for speed optimization.
3119cdf0e10cSrcweir             bVisRow = true;
3120cdf0e10cSrcweir             continue;
3121cdf0e10cSrcweir         }
3122cdf0e10cSrcweir 
3123cdf0e10cSrcweir         SCROW nLastRow = -1;
3124cdf0e10cSrcweir         if (!pDoc->RowHidden(nRow, nPrintTab, NULL, &nLastRow))
3125cdf0e10cSrcweir         {
3126cdf0e10cSrcweir             bVisRow = true;
3127cdf0e10cSrcweir             nLastVisibleRow = nLastRow;
3128cdf0e10cSrcweir         }
3129cdf0e10cSrcweir         else
3130cdf0e10cSrcweir             // skip all hidden rows.
3131cdf0e10cSrcweir             nRow = nLastRow;
3132cdf0e10cSrcweir     }
3133cdf0e10cSrcweir 
3134cdf0e10cSrcweir     if (bVisRow)
3135cdf0e10cSrcweir     {
3136*590a31a1SArmin Le Grand         OSL_ENSURE(nTotalY < maPageEndY.size(), "vector access error for maPageEndY (!)");
3137*590a31a1SArmin Le Grand         maPageEndY[nTotalY] = nEndRow;
3138cdf0e10cSrcweir         ++nTotalY;
3139cdf0e10cSrcweir 
3140cdf0e10cSrcweir         if ( !aTableParam.bSkipEmpty ||
3141cdf0e10cSrcweir                 !pDoc->IsPrintEmpty( nPrintTab, nStartCol, nPageStartRow, nEndCol, nEndRow ) )
3142cdf0e10cSrcweir         {
3143*590a31a1SArmin Le Grand             OSL_ENSURE(nPagesY < maPageRows.size(), "vector access error for maPageRows (!)");
3144*590a31a1SArmin Le Grand             maPageRows[nPagesY].SetStartRow( nPageStartRow );
3145*590a31a1SArmin Le Grand             maPageRows[nPagesY].SetEndRow( nEndRow );
3146*590a31a1SArmin Le Grand             maPageRows[nPagesY].SetPagesX( nPagesX );
3147cdf0e10cSrcweir             if (aTableParam.bSkipEmpty)
3148*590a31a1SArmin Le Grand                 lcl_SetHidden( pDoc, nPrintTab, maPageRows[nPagesY], nStartCol, maPageEndX );
3149cdf0e10cSrcweir             ++nPagesY;
3150cdf0e10cSrcweir         }
3151cdf0e10cSrcweir     }
3152cdf0e10cSrcweir }
3153cdf0e10cSrcweir 
3154cdf0e10cSrcweir //------------------------------------------------------------------------
3155cdf0e10cSrcweir //	class ScJobSetup
3156cdf0e10cSrcweir //------------------------------------------------------------------------
3157cdf0e10cSrcweir 
ScJobSetup(SfxPrinter * pPrinter)3158cdf0e10cSrcweir ScJobSetup::ScJobSetup( SfxPrinter* pPrinter )
3159cdf0e10cSrcweir {
3160cdf0e10cSrcweir 	eOrientation = pPrinter->GetOrientation();
3161cdf0e10cSrcweir 	nPaperBin	 = pPrinter->GetPaperBin();
3162cdf0e10cSrcweir 	ePaper		 = pPrinter->GetPaper();
3163cdf0e10cSrcweir 
3164cdf0e10cSrcweir 	if ( PAPER_USER == ePaper )
3165cdf0e10cSrcweir 	{
3166cdf0e10cSrcweir 		aUserSize = pPrinter->GetPaperSize();
3167cdf0e10cSrcweir 		aUserMapMode = pPrinter->GetMapMode();
3168cdf0e10cSrcweir 	}
3169cdf0e10cSrcweir };
3170cdf0e10cSrcweir 
3171cdf0e10cSrcweir 
3172cdf0e10cSrcweir 
3173cdf0e10cSrcweir 
3174cdf0e10cSrcweir 
3175