xref: /aoo41x/main/sc/source/ui/view/prevloc.cxx (revision cdf0e10c)
1*cdf0e10cSrcweir /*************************************************************************
2*cdf0e10cSrcweir  *
3*cdf0e10cSrcweir  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4*cdf0e10cSrcweir  *
5*cdf0e10cSrcweir  * Copyright 2000, 2010 Oracle and/or its affiliates.
6*cdf0e10cSrcweir  *
7*cdf0e10cSrcweir  * OpenOffice.org - a multi-platform office productivity suite
8*cdf0e10cSrcweir  *
9*cdf0e10cSrcweir  * This file is part of OpenOffice.org.
10*cdf0e10cSrcweir  *
11*cdf0e10cSrcweir  * OpenOffice.org is free software: you can redistribute it and/or modify
12*cdf0e10cSrcweir  * it under the terms of the GNU Lesser General Public License version 3
13*cdf0e10cSrcweir  * only, as published by the Free Software Foundation.
14*cdf0e10cSrcweir  *
15*cdf0e10cSrcweir  * OpenOffice.org is distributed in the hope that it will be useful,
16*cdf0e10cSrcweir  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17*cdf0e10cSrcweir  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*cdf0e10cSrcweir  * GNU Lesser General Public License version 3 for more details
19*cdf0e10cSrcweir  * (a copy is included in the LICENSE file that accompanied this code).
20*cdf0e10cSrcweir  *
21*cdf0e10cSrcweir  * You should have received a copy of the GNU Lesser General Public License
22*cdf0e10cSrcweir  * version 3 along with OpenOffice.org.  If not, see
23*cdf0e10cSrcweir  * <http://www.openoffice.org/license.html>
24*cdf0e10cSrcweir  * for a copy of the LGPLv3 License.
25*cdf0e10cSrcweir  *
26*cdf0e10cSrcweir  ************************************************************************/
27*cdf0e10cSrcweir 
28*cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
29*cdf0e10cSrcweir #include "precompiled_sc.hxx"
30*cdf0e10cSrcweir 
31*cdf0e10cSrcweir 
32*cdf0e10cSrcweir 
33*cdf0e10cSrcweir // INCLUDE ---------------------------------------------------------------
34*cdf0e10cSrcweir 
35*cdf0e10cSrcweir #include <vcl/outdev.hxx>
36*cdf0e10cSrcweir #include <tools/debug.hxx>
37*cdf0e10cSrcweir 
38*cdf0e10cSrcweir #include "prevloc.hxx"
39*cdf0e10cSrcweir #include "document.hxx"
40*cdf0e10cSrcweir 
41*cdf0e10cSrcweir //==================================================================
42*cdf0e10cSrcweir 
43*cdf0e10cSrcweir enum ScPreviewLocationType
44*cdf0e10cSrcweir {
45*cdf0e10cSrcweir 	SC_PLOC_CELLRANGE,
46*cdf0e10cSrcweir 	SC_PLOC_COLHEADER,
47*cdf0e10cSrcweir 	SC_PLOC_ROWHEADER,
48*cdf0e10cSrcweir 	SC_PLOC_LEFTHEADER,
49*cdf0e10cSrcweir 	SC_PLOC_RIGHTHEADER,
50*cdf0e10cSrcweir 	SC_PLOC_LEFTFOOTER,
51*cdf0e10cSrcweir 	SC_PLOC_RIGHTFOOTER,
52*cdf0e10cSrcweir 	SC_PLOC_NOTEMARK,
53*cdf0e10cSrcweir 	SC_PLOC_NOTETEXT
54*cdf0e10cSrcweir };
55*cdf0e10cSrcweir 
56*cdf0e10cSrcweir struct ScPreviewLocationEntry
57*cdf0e10cSrcweir {
58*cdf0e10cSrcweir 	ScPreviewLocationType	eType;
59*cdf0e10cSrcweir 	Rectangle				aPixelRect;
60*cdf0e10cSrcweir 	ScRange					aCellRange;
61*cdf0e10cSrcweir 	sal_Bool					bRepeatCol;
62*cdf0e10cSrcweir 	sal_Bool					bRepeatRow;
63*cdf0e10cSrcweir 
64*cdf0e10cSrcweir 	ScPreviewLocationEntry( ScPreviewLocationType eNewType, const Rectangle& rPixel, const ScRange& rRange,
65*cdf0e10cSrcweir 							sal_Bool bRepCol, sal_Bool bRepRow ) :
66*cdf0e10cSrcweir 		eType( eNewType ),
67*cdf0e10cSrcweir 		aPixelRect( rPixel ),
68*cdf0e10cSrcweir 		aCellRange( rRange ),
69*cdf0e10cSrcweir 		bRepeatCol( bRepCol ),
70*cdf0e10cSrcweir 		bRepeatRow( bRepRow )
71*cdf0e10cSrcweir 	{
72*cdf0e10cSrcweir 	}
73*cdf0e10cSrcweir };
74*cdf0e10cSrcweir 
75*cdf0e10cSrcweir //==================================================================
76*cdf0e10cSrcweir 
77*cdf0e10cSrcweir ScPreviewTableInfo::ScPreviewTableInfo() :
78*cdf0e10cSrcweir 	nTab(0),
79*cdf0e10cSrcweir 	nCols(0),
80*cdf0e10cSrcweir 	nRows(0),
81*cdf0e10cSrcweir 	pColInfo(NULL),
82*cdf0e10cSrcweir 	pRowInfo(NULL)
83*cdf0e10cSrcweir {
84*cdf0e10cSrcweir }
85*cdf0e10cSrcweir 
86*cdf0e10cSrcweir ScPreviewTableInfo::~ScPreviewTableInfo()
87*cdf0e10cSrcweir {
88*cdf0e10cSrcweir 	delete[] pColInfo;
89*cdf0e10cSrcweir 	delete[] pRowInfo;
90*cdf0e10cSrcweir }
91*cdf0e10cSrcweir 
92*cdf0e10cSrcweir void ScPreviewTableInfo::SetTab( SCTAB nNewTab )
93*cdf0e10cSrcweir {
94*cdf0e10cSrcweir 	nTab = nNewTab;
95*cdf0e10cSrcweir }
96*cdf0e10cSrcweir 
97*cdf0e10cSrcweir void ScPreviewTableInfo::SetColInfo( SCCOL nCount, ScPreviewColRowInfo* pNewInfo )
98*cdf0e10cSrcweir {
99*cdf0e10cSrcweir 	delete[] pColInfo;
100*cdf0e10cSrcweir 	pColInfo = pNewInfo;
101*cdf0e10cSrcweir 	nCols = nCount;
102*cdf0e10cSrcweir }
103*cdf0e10cSrcweir 
104*cdf0e10cSrcweir void ScPreviewTableInfo::SetRowInfo( SCROW nCount, ScPreviewColRowInfo* pNewInfo )
105*cdf0e10cSrcweir {
106*cdf0e10cSrcweir 	delete[] pRowInfo;
107*cdf0e10cSrcweir 	pRowInfo = pNewInfo;
108*cdf0e10cSrcweir 	nRows = nCount;
109*cdf0e10cSrcweir }
110*cdf0e10cSrcweir 
111*cdf0e10cSrcweir void ScPreviewTableInfo::LimitToArea( const Rectangle& rPixelArea )
112*cdf0e10cSrcweir {
113*cdf0e10cSrcweir 	if ( pColInfo )
114*cdf0e10cSrcweir 	{
115*cdf0e10cSrcweir 		//	cells completely left of the visible area
116*cdf0e10cSrcweir 		SCCOL nStart = 0;
117*cdf0e10cSrcweir 		while ( nStart < nCols && pColInfo[nStart].nPixelEnd < rPixelArea.Left() )
118*cdf0e10cSrcweir 			++nStart;
119*cdf0e10cSrcweir 
120*cdf0e10cSrcweir 		//	cells completely right of the visible area
121*cdf0e10cSrcweir 		SCCOL nEnd = nCols;
122*cdf0e10cSrcweir 		while ( nEnd > 0 && pColInfo[nEnd-1].nPixelStart > rPixelArea.Right() )
123*cdf0e10cSrcweir 			--nEnd;
124*cdf0e10cSrcweir 
125*cdf0e10cSrcweir 		if ( nStart > 0 || nEnd < nCols )
126*cdf0e10cSrcweir 		{
127*cdf0e10cSrcweir 			if ( nEnd > nStart )
128*cdf0e10cSrcweir 			{
129*cdf0e10cSrcweir 				SCCOL nNewCount = nEnd - nStart;
130*cdf0e10cSrcweir 				ScPreviewColRowInfo* pNewInfo = new ScPreviewColRowInfo[nNewCount];
131*cdf0e10cSrcweir 				for (SCCOL i=0; i<nNewCount; i++)
132*cdf0e10cSrcweir 					pNewInfo[i] = pColInfo[nStart + i];
133*cdf0e10cSrcweir 				SetColInfo( nNewCount, pNewInfo );
134*cdf0e10cSrcweir 			}
135*cdf0e10cSrcweir 			else
136*cdf0e10cSrcweir 				SetColInfo( 0, NULL );		// all invisible
137*cdf0e10cSrcweir 		}
138*cdf0e10cSrcweir 	}
139*cdf0e10cSrcweir 
140*cdf0e10cSrcweir 	if ( pRowInfo )
141*cdf0e10cSrcweir 	{
142*cdf0e10cSrcweir 		//	cells completely above the visible area
143*cdf0e10cSrcweir 		SCROW nStart = 0;
144*cdf0e10cSrcweir 		while ( nStart < nRows && pRowInfo[nStart].nPixelEnd < rPixelArea.Top() )
145*cdf0e10cSrcweir 			++nStart;
146*cdf0e10cSrcweir 
147*cdf0e10cSrcweir 		//	cells completely below the visible area
148*cdf0e10cSrcweir 		SCROW nEnd = nRows;
149*cdf0e10cSrcweir 		while ( nEnd > 0 && pRowInfo[nEnd-1].nPixelStart > rPixelArea.Bottom() )
150*cdf0e10cSrcweir 			--nEnd;
151*cdf0e10cSrcweir 
152*cdf0e10cSrcweir 		if ( nStart > 0 || nEnd < nRows )
153*cdf0e10cSrcweir 		{
154*cdf0e10cSrcweir 			if ( nEnd > nStart )
155*cdf0e10cSrcweir 			{
156*cdf0e10cSrcweir 				SCROW nNewCount = nEnd - nStart;
157*cdf0e10cSrcweir 				ScPreviewColRowInfo* pNewInfo = new ScPreviewColRowInfo[nNewCount];
158*cdf0e10cSrcweir 				for (SCROW i=0; i<nNewCount; i++)
159*cdf0e10cSrcweir 					pNewInfo[i] = pRowInfo[nStart + i];
160*cdf0e10cSrcweir 				SetRowInfo( nNewCount, pNewInfo );
161*cdf0e10cSrcweir 			}
162*cdf0e10cSrcweir 			else
163*cdf0e10cSrcweir 				SetRowInfo( 0, NULL );		// all invisible
164*cdf0e10cSrcweir 		}
165*cdf0e10cSrcweir 	}
166*cdf0e10cSrcweir }
167*cdf0e10cSrcweir 
168*cdf0e10cSrcweir //------------------------------------------------------------------
169*cdf0e10cSrcweir 
170*cdf0e10cSrcweir ScPreviewLocationData::ScPreviewLocationData( ScDocument* pDocument, OutputDevice* pWin ) :
171*cdf0e10cSrcweir 	pWindow( pWin ),
172*cdf0e10cSrcweir 	pDoc( pDocument ),
173*cdf0e10cSrcweir 	nDrawRanges( 0 ),
174*cdf0e10cSrcweir 	nPrintTab( 0 )
175*cdf0e10cSrcweir {
176*cdf0e10cSrcweir }
177*cdf0e10cSrcweir 
178*cdf0e10cSrcweir ScPreviewLocationData::~ScPreviewLocationData()
179*cdf0e10cSrcweir {
180*cdf0e10cSrcweir 	Clear();
181*cdf0e10cSrcweir }
182*cdf0e10cSrcweir 
183*cdf0e10cSrcweir void ScPreviewLocationData::SetCellMapMode( const MapMode& rMapMode )
184*cdf0e10cSrcweir {
185*cdf0e10cSrcweir 	aCellMapMode = rMapMode;
186*cdf0e10cSrcweir }
187*cdf0e10cSrcweir 
188*cdf0e10cSrcweir void ScPreviewLocationData::SetPrintTab( SCTAB nNew )
189*cdf0e10cSrcweir {
190*cdf0e10cSrcweir 	nPrintTab = nNew;
191*cdf0e10cSrcweir }
192*cdf0e10cSrcweir 
193*cdf0e10cSrcweir void ScPreviewLocationData::Clear()
194*cdf0e10cSrcweir {
195*cdf0e10cSrcweir 	void* pEntry = aEntries.First();
196*cdf0e10cSrcweir 	while ( pEntry )
197*cdf0e10cSrcweir 	{
198*cdf0e10cSrcweir 		delete (ScPreviewLocationEntry*) pEntry;
199*cdf0e10cSrcweir 		pEntry = aEntries.Next();
200*cdf0e10cSrcweir 	}
201*cdf0e10cSrcweir 	aEntries.Clear();
202*cdf0e10cSrcweir 
203*cdf0e10cSrcweir 	nDrawRanges = 0;
204*cdf0e10cSrcweir }
205*cdf0e10cSrcweir 
206*cdf0e10cSrcweir void ScPreviewLocationData::AddCellRange( const Rectangle& rRect, const ScRange& rRange, sal_Bool bRepCol, sal_Bool bRepRow,
207*cdf0e10cSrcweir 											const MapMode& rDrawMap )
208*cdf0e10cSrcweir {
209*cdf0e10cSrcweir 	Rectangle aPixelRect( pWindow->LogicToPixel( rRect ) );
210*cdf0e10cSrcweir 	aEntries.Insert( new ScPreviewLocationEntry( SC_PLOC_CELLRANGE, aPixelRect, rRange, bRepCol, bRepRow ) );
211*cdf0e10cSrcweir 
212*cdf0e10cSrcweir 	DBG_ASSERT( nDrawRanges < SC_PREVIEW_MAXRANGES, "too many ranges" );
213*cdf0e10cSrcweir 	if ( nDrawRanges < SC_PREVIEW_MAXRANGES )
214*cdf0e10cSrcweir 	{
215*cdf0e10cSrcweir 		aDrawRectangle[nDrawRanges] = aPixelRect;
216*cdf0e10cSrcweir 		aDrawMapMode[nDrawRanges] = rDrawMap;
217*cdf0e10cSrcweir 	        if (bRepCol)
218*cdf0e10cSrcweir         	    if (bRepRow)
219*cdf0e10cSrcweir                 	aDrawRangeId[nDrawRanges] = SC_PREVIEW_RANGE_EDGE;
220*cdf0e10cSrcweir 	            else
221*cdf0e10cSrcweir         	        aDrawRangeId[nDrawRanges] = SC_PREVIEW_RANGE_REPCOL;
222*cdf0e10cSrcweir 	        else
223*cdf0e10cSrcweir         	    if (bRepRow)
224*cdf0e10cSrcweir                 	aDrawRangeId[nDrawRanges] = SC_PREVIEW_RANGE_REPROW;
225*cdf0e10cSrcweir 	            else
226*cdf0e10cSrcweir         	        aDrawRangeId[nDrawRanges] = SC_PREVIEW_RANGE_TAB;
227*cdf0e10cSrcweir 		++nDrawRanges;
228*cdf0e10cSrcweir 	}
229*cdf0e10cSrcweir }
230*cdf0e10cSrcweir 
231*cdf0e10cSrcweir void ScPreviewLocationData::AddColHeaders( const Rectangle& rRect, SCCOL nStartCol, SCCOL nEndCol, sal_Bool bRepCol )
232*cdf0e10cSrcweir {
233*cdf0e10cSrcweir 	SCTAB nTab = 0;	//! ?
234*cdf0e10cSrcweir 	ScRange aRange( nStartCol, 0, nTab, nEndCol, 0, nTab );
235*cdf0e10cSrcweir 	Rectangle aPixelRect( pWindow->LogicToPixel( rRect ) );
236*cdf0e10cSrcweir 	aEntries.Insert( new ScPreviewLocationEntry( SC_PLOC_COLHEADER, aPixelRect, aRange, bRepCol, sal_False ) );
237*cdf0e10cSrcweir }
238*cdf0e10cSrcweir 
239*cdf0e10cSrcweir void ScPreviewLocationData::AddRowHeaders( const Rectangle& rRect, SCROW nStartRow, SCROW nEndRow, sal_Bool bRepRow )
240*cdf0e10cSrcweir {
241*cdf0e10cSrcweir 	SCTAB nTab = 0;	//! ?
242*cdf0e10cSrcweir 	ScRange aRange( 0, nStartRow, nTab, 0, nEndRow, nTab );
243*cdf0e10cSrcweir 	Rectangle aPixelRect( pWindow->LogicToPixel( rRect ) );
244*cdf0e10cSrcweir 	aEntries.Insert( new ScPreviewLocationEntry( SC_PLOC_ROWHEADER, aPixelRect, aRange, sal_False, bRepRow ) );
245*cdf0e10cSrcweir }
246*cdf0e10cSrcweir 
247*cdf0e10cSrcweir void ScPreviewLocationData::AddHeaderFooter( const Rectangle& rRect, sal_Bool bHeader, sal_Bool bLeft )
248*cdf0e10cSrcweir {
249*cdf0e10cSrcweir 	ScRange aRange;		//! ?
250*cdf0e10cSrcweir 	Rectangle aPixelRect( pWindow->LogicToPixel( rRect ) );
251*cdf0e10cSrcweir 
252*cdf0e10cSrcweir 	ScPreviewLocationType eType = bHeader ?
253*cdf0e10cSrcweir 				( bLeft ? SC_PLOC_LEFTHEADER : SC_PLOC_RIGHTHEADER ) :
254*cdf0e10cSrcweir 				( bLeft ? SC_PLOC_LEFTFOOTER : SC_PLOC_RIGHTFOOTER );
255*cdf0e10cSrcweir 	aEntries.Insert( new ScPreviewLocationEntry( eType, aPixelRect, aRange, sal_False, sal_False ) );
256*cdf0e10cSrcweir }
257*cdf0e10cSrcweir 
258*cdf0e10cSrcweir void ScPreviewLocationData::AddNoteMark( const Rectangle& rRect, const ScAddress& rPos )
259*cdf0e10cSrcweir {
260*cdf0e10cSrcweir 	ScRange aRange( rPos );
261*cdf0e10cSrcweir 	Rectangle aPixelRect( pWindow->LogicToPixel( rRect ) );
262*cdf0e10cSrcweir 	aEntries.Insert( new ScPreviewLocationEntry( SC_PLOC_NOTEMARK, aPixelRect, aRange, sal_False, sal_False ) );
263*cdf0e10cSrcweir }
264*cdf0e10cSrcweir 
265*cdf0e10cSrcweir void ScPreviewLocationData::AddNoteText( const Rectangle& rRect, const ScAddress& rPos )
266*cdf0e10cSrcweir {
267*cdf0e10cSrcweir 	ScRange aRange( rPos );
268*cdf0e10cSrcweir 	Rectangle aPixelRect( pWindow->LogicToPixel( rRect ) );
269*cdf0e10cSrcweir 	aEntries.Insert( new ScPreviewLocationEntry( SC_PLOC_NOTETEXT, aPixelRect, aRange, sal_False, sal_False ) );
270*cdf0e10cSrcweir }
271*cdf0e10cSrcweir 
272*cdf0e10cSrcweir //------------------------------------------------------------------
273*cdf0e10cSrcweir 
274*cdf0e10cSrcweir void ScPreviewLocationData::GetDrawRange( sal_uInt16 nPos, Rectangle& rPixelRect, MapMode& rMapMode, sal_uInt8& rRangeId ) const
275*cdf0e10cSrcweir {
276*cdf0e10cSrcweir 	DBG_ASSERT( nPos < nDrawRanges, "wrong position" );
277*cdf0e10cSrcweir 	if ( nPos < nDrawRanges )
278*cdf0e10cSrcweir 	{
279*cdf0e10cSrcweir 		rPixelRect = aDrawRectangle[nPos];
280*cdf0e10cSrcweir 		rMapMode = aDrawMapMode[nPos];
281*cdf0e10cSrcweir         rRangeId = aDrawRangeId[nPos];
282*cdf0e10cSrcweir 	}
283*cdf0e10cSrcweir }
284*cdf0e10cSrcweir 
285*cdf0e10cSrcweir ScPreviewLocationEntry* lcl_GetEntryByAddress( const List& rEntries, const ScAddress& rPos, ScPreviewLocationType eType )
286*cdf0e10cSrcweir {
287*cdf0e10cSrcweir 	sal_uLong nCount = rEntries.Count();
288*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
289*cdf0e10cSrcweir 	{
290*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)rEntries.GetObject(nListPos);
291*cdf0e10cSrcweir 		if ( pEntry->eType == eType && pEntry->aCellRange.In( rPos ) )
292*cdf0e10cSrcweir 			return pEntry;
293*cdf0e10cSrcweir 	}
294*cdf0e10cSrcweir 	return NULL;
295*cdf0e10cSrcweir }
296*cdf0e10cSrcweir 
297*cdf0e10cSrcweir //UNUSED2008-05  ScAddress ScPreviewLocationData::GetCellFromRange( const Size& rOffsetPixel, const ScRange& rRange ) const
298*cdf0e10cSrcweir //UNUSED2008-05  {
299*cdf0e10cSrcweir //UNUSED2008-05      const double nScaleX = HMM_PER_TWIPS;
300*cdf0e10cSrcweir //UNUSED2008-05      const double nScaleY = HMM_PER_TWIPS;
301*cdf0e10cSrcweir //UNUSED2008-05
302*cdf0e10cSrcweir //UNUSED2008-05      Size aOffsetLogic = pWindow->PixelToLogic( rOffsetPixel, aCellMapMode );
303*cdf0e10cSrcweir //UNUSED2008-05      SCTAB nTab = rRange.aStart.Tab();
304*cdf0e10cSrcweir //UNUSED2008-05
305*cdf0e10cSrcweir //UNUSED2008-05      long nPosX = 0;
306*cdf0e10cSrcweir //UNUSED2008-05      SCCOL nCol = rRange.aStart.Col();
307*cdf0e10cSrcweir //UNUSED2008-05      SCCOL nEndCol = rRange.aEnd.Col();
308*cdf0e10cSrcweir //UNUSED2008-05      while ( nCol <= nEndCol && nPosX < aOffsetLogic.Width() )
309*cdf0e10cSrcweir //UNUSED2008-05      {
310*cdf0e10cSrcweir //UNUSED2008-05          sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nTab );
311*cdf0e10cSrcweir //UNUSED2008-05          if (nDocW)
312*cdf0e10cSrcweir //UNUSED2008-05              nPosX += (long) (nDocW * nScaleX);
313*cdf0e10cSrcweir //UNUSED2008-05          ++nCol;
314*cdf0e10cSrcweir //UNUSED2008-05      }
315*cdf0e10cSrcweir //UNUSED2008-05      if ( nCol > rRange.aStart.Col() )
316*cdf0e10cSrcweir //UNUSED2008-05          --nCol;
317*cdf0e10cSrcweir //UNUSED2008-05
318*cdf0e10cSrcweir //UNUSED2008-05      long nPosY = 0;
319*cdf0e10cSrcweir //UNUSED2008-05      ScCoupledCompressedArrayIterator< SCROW, sal_uInt8, sal_uInt16> aIter(
320*cdf0e10cSrcweir //UNUSED2008-05              pDoc->GetRowFlagsArray( nTab), rRange.aStart.Row(),
321*cdf0e10cSrcweir //UNUSED2008-05              rRange.aEnd.Row(), CR_HIDDEN, 0, pDoc->GetRowHeightArray( nTab));
322*cdf0e10cSrcweir //UNUSED2008-05      while ( aIter && nPosY < aOffsetLogic.Height() )
323*cdf0e10cSrcweir //UNUSED2008-05      {
324*cdf0e10cSrcweir //UNUSED2008-05          sal_uInt16 nDocH = *aIter;
325*cdf0e10cSrcweir //UNUSED2008-05          if (nDocH)
326*cdf0e10cSrcweir //UNUSED2008-05              nPosY += (long) (nDocH * nScaleY);
327*cdf0e10cSrcweir //UNUSED2008-05          ++aIter;
328*cdf0e10cSrcweir //UNUSED2008-05      }
329*cdf0e10cSrcweir //UNUSED2008-05      SCROW nRow = aIter.GetPos();
330*cdf0e10cSrcweir //UNUSED2008-05      if ( nRow > rRange.aStart.Row() )
331*cdf0e10cSrcweir //UNUSED2008-05          --nRow;
332*cdf0e10cSrcweir //UNUSED2008-05
333*cdf0e10cSrcweir //UNUSED2008-05      return ScAddress( nCol, nRow, nTab );
334*cdf0e10cSrcweir //UNUSED2008-05  }
335*cdf0e10cSrcweir 
336*cdf0e10cSrcweir Rectangle ScPreviewLocationData::GetOffsetPixel( const ScAddress& rCellPos, const ScRange& rRange ) const
337*cdf0e10cSrcweir {
338*cdf0e10cSrcweir 	const double nScaleX = HMM_PER_TWIPS;
339*cdf0e10cSrcweir 	const double nScaleY = HMM_PER_TWIPS;
340*cdf0e10cSrcweir 	SCTAB nTab = rRange.aStart.Tab();
341*cdf0e10cSrcweir 
342*cdf0e10cSrcweir 	long nPosX = 0;
343*cdf0e10cSrcweir 	SCCOL nEndCol = rCellPos.Col();
344*cdf0e10cSrcweir 	for (SCCOL nCol = rRange.aStart.Col(); nCol < nEndCol; nCol++)
345*cdf0e10cSrcweir 	{
346*cdf0e10cSrcweir 		sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nTab );
347*cdf0e10cSrcweir 		if (nDocW)
348*cdf0e10cSrcweir 			nPosX += (long) (nDocW * nScaleX);
349*cdf0e10cSrcweir 	}
350*cdf0e10cSrcweir 	long nSizeX = (long) ( pDoc->GetColWidth( nEndCol, nTab ) * nScaleX );
351*cdf0e10cSrcweir 
352*cdf0e10cSrcweir 	SCROW nEndRow = rCellPos.Row();
353*cdf0e10cSrcweir     long nPosY = (long) pDoc->GetScaledRowHeight( rRange.aStart.Row(),
354*cdf0e10cSrcweir             nEndRow, nTab, nScaleY);
355*cdf0e10cSrcweir 	long nSizeY = (long) ( pDoc->GetRowHeight( nEndRow, nTab ) * nScaleY );
356*cdf0e10cSrcweir 
357*cdf0e10cSrcweir 	Size aOffsetLogic( nPosX, nPosY );
358*cdf0e10cSrcweir 	Size aSizeLogic( nSizeX, nSizeY );
359*cdf0e10cSrcweir 	Size aOffsetPixel = pWindow->LogicToPixel( aOffsetLogic, aCellMapMode );
360*cdf0e10cSrcweir 	Size aSizePixel = pWindow->LogicToPixel( aSizeLogic, aCellMapMode );
361*cdf0e10cSrcweir 
362*cdf0e10cSrcweir 	return Rectangle( Point( aOffsetPixel.Width(), aOffsetPixel.Height() ), aSizePixel );
363*cdf0e10cSrcweir }
364*cdf0e10cSrcweir 
365*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::GetCellPosition( const ScAddress& rCellPos, Rectangle& rCellRect ) const
366*cdf0e10cSrcweir {
367*cdf0e10cSrcweir 	ScPreviewLocationEntry* pEntry = lcl_GetEntryByAddress( aEntries, rCellPos, SC_PLOC_CELLRANGE );
368*cdf0e10cSrcweir 	if ( pEntry )
369*cdf0e10cSrcweir 	{
370*cdf0e10cSrcweir 		Rectangle aOffsetRect = GetOffsetPixel( rCellPos, pEntry->aCellRange );
371*cdf0e10cSrcweir 		rCellRect = Rectangle( aOffsetRect.Left() + pEntry->aPixelRect.Left(),
372*cdf0e10cSrcweir 							   aOffsetRect.Top() + pEntry->aPixelRect.Top(),
373*cdf0e10cSrcweir 							   aOffsetRect.Right() + pEntry->aPixelRect.Left(),
374*cdf0e10cSrcweir 							   aOffsetRect.Bottom() + pEntry->aPixelRect.Top() );
375*cdf0e10cSrcweir 		return sal_True;
376*cdf0e10cSrcweir 	}
377*cdf0e10cSrcweir 	return sal_False;
378*cdf0e10cSrcweir }
379*cdf0e10cSrcweir 
380*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::HasCellsInRange( const Rectangle& rVisiblePixel ) const
381*cdf0e10cSrcweir {
382*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
383*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
384*cdf0e10cSrcweir 	{
385*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
386*cdf0e10cSrcweir 		ScPreviewLocationType eType = pEntry->eType;
387*cdf0e10cSrcweir 		if ( eType == SC_PLOC_CELLRANGE || eType == SC_PLOC_COLHEADER || eType == SC_PLOC_ROWHEADER )
388*cdf0e10cSrcweir 			if ( pEntry->aPixelRect.IsOver( rVisiblePixel ) )
389*cdf0e10cSrcweir 				return sal_True;
390*cdf0e10cSrcweir 	}
391*cdf0e10cSrcweir 	return sal_False;
392*cdf0e10cSrcweir }
393*cdf0e10cSrcweir 
394*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::GetHeaderPosition( Rectangle& rRect ) const
395*cdf0e10cSrcweir {
396*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
397*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
398*cdf0e10cSrcweir 	{
399*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
400*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_LEFTHEADER || pEntry->eType == SC_PLOC_RIGHTHEADER )
401*cdf0e10cSrcweir 		{
402*cdf0e10cSrcweir 			rRect = pEntry->aPixelRect;
403*cdf0e10cSrcweir 			return sal_True;
404*cdf0e10cSrcweir 		}
405*cdf0e10cSrcweir 	}
406*cdf0e10cSrcweir 	return sal_False;
407*cdf0e10cSrcweir }
408*cdf0e10cSrcweir 
409*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::GetFooterPosition( Rectangle& rRect ) const
410*cdf0e10cSrcweir {
411*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
412*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
413*cdf0e10cSrcweir 	{
414*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
415*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_LEFTFOOTER || pEntry->eType == SC_PLOC_RIGHTFOOTER )
416*cdf0e10cSrcweir 		{
417*cdf0e10cSrcweir 			rRect = pEntry->aPixelRect;
418*cdf0e10cSrcweir 			return sal_True;
419*cdf0e10cSrcweir 		}
420*cdf0e10cSrcweir 	}
421*cdf0e10cSrcweir 	return sal_False;
422*cdf0e10cSrcweir }
423*cdf0e10cSrcweir 
424*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::IsHeaderLeft() const
425*cdf0e10cSrcweir {
426*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
427*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
428*cdf0e10cSrcweir 	{
429*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
430*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_LEFTHEADER )
431*cdf0e10cSrcweir 			return sal_True;
432*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_RIGHTHEADER )
433*cdf0e10cSrcweir 			return sal_False;
434*cdf0e10cSrcweir 	}
435*cdf0e10cSrcweir 	return sal_False;
436*cdf0e10cSrcweir }
437*cdf0e10cSrcweir 
438*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::IsFooterLeft() const
439*cdf0e10cSrcweir {
440*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
441*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
442*cdf0e10cSrcweir 	{
443*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
444*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_LEFTFOOTER )
445*cdf0e10cSrcweir 			return sal_True;
446*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_RIGHTFOOTER )
447*cdf0e10cSrcweir 			return sal_False;
448*cdf0e10cSrcweir 	}
449*cdf0e10cSrcweir 	return sal_False;
450*cdf0e10cSrcweir }
451*cdf0e10cSrcweir 
452*cdf0e10cSrcweir long ScPreviewLocationData::GetNoteCountInRange( const Rectangle& rVisiblePixel, sal_Bool bNoteMarks ) const
453*cdf0e10cSrcweir {
454*cdf0e10cSrcweir 	ScPreviewLocationType eType = bNoteMarks ? SC_PLOC_NOTEMARK : SC_PLOC_NOTETEXT;
455*cdf0e10cSrcweir 
456*cdf0e10cSrcweir 	sal_uLong nRet = 0;
457*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
458*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
459*cdf0e10cSrcweir 	{
460*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
461*cdf0e10cSrcweir 		if ( pEntry->eType == eType && pEntry->aPixelRect.IsOver( rVisiblePixel ) )
462*cdf0e10cSrcweir 			++nRet;
463*cdf0e10cSrcweir 	}
464*cdf0e10cSrcweir 	return nRet;
465*cdf0e10cSrcweir }
466*cdf0e10cSrcweir 
467*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::GetNoteInRange( const Rectangle& rVisiblePixel, long nIndex, sal_Bool bNoteMarks,
468*cdf0e10cSrcweir 											ScAddress& rCellPos, Rectangle& rNoteRect ) const
469*cdf0e10cSrcweir {
470*cdf0e10cSrcweir 	ScPreviewLocationType eType = bNoteMarks ? SC_PLOC_NOTEMARK : SC_PLOC_NOTETEXT;
471*cdf0e10cSrcweir 
472*cdf0e10cSrcweir 	sal_uLong nPos = 0;
473*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
474*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
475*cdf0e10cSrcweir 	{
476*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
477*cdf0e10cSrcweir 		if ( pEntry->eType == eType && pEntry->aPixelRect.IsOver( rVisiblePixel ) )
478*cdf0e10cSrcweir 		{
479*cdf0e10cSrcweir             if ( nPos == sal::static_int_cast<sal_uLong>(nIndex) )
480*cdf0e10cSrcweir 			{
481*cdf0e10cSrcweir 				rCellPos = pEntry->aCellRange.aStart;
482*cdf0e10cSrcweir 				rNoteRect = pEntry->aPixelRect;
483*cdf0e10cSrcweir 				return sal_True;
484*cdf0e10cSrcweir 			}
485*cdf0e10cSrcweir 			++nPos;
486*cdf0e10cSrcweir 		}
487*cdf0e10cSrcweir 	}
488*cdf0e10cSrcweir 	return sal_False;
489*cdf0e10cSrcweir }
490*cdf0e10cSrcweir 
491*cdf0e10cSrcweir Rectangle ScPreviewLocationData::GetNoteInRangeOutputRect(const Rectangle& rVisiblePixel, sal_Bool bNoteMarks, const ScAddress& aCellPos) const
492*cdf0e10cSrcweir {
493*cdf0e10cSrcweir 	ScPreviewLocationType eType = bNoteMarks ? SC_PLOC_NOTEMARK : SC_PLOC_NOTETEXT;
494*cdf0e10cSrcweir 
495*cdf0e10cSrcweir 	sal_uLong nPos = 0;
496*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
497*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
498*cdf0e10cSrcweir 	{
499*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
500*cdf0e10cSrcweir 		if ( pEntry->eType == eType && pEntry->aPixelRect.IsOver( rVisiblePixel ) )
501*cdf0e10cSrcweir 		{
502*cdf0e10cSrcweir 			if ( aCellPos == pEntry->aCellRange.aStart )
503*cdf0e10cSrcweir 				return pEntry->aPixelRect;
504*cdf0e10cSrcweir 			++nPos;
505*cdf0e10cSrcweir 		}
506*cdf0e10cSrcweir 	}
507*cdf0e10cSrcweir 	return Rectangle();
508*cdf0e10cSrcweir }
509*cdf0e10cSrcweir 
510*cdf0e10cSrcweir void ScPreviewLocationData::GetTableInfo( const Rectangle& rVisiblePixel, ScPreviewTableInfo& rInfo ) const
511*cdf0e10cSrcweir {
512*cdf0e10cSrcweir 	const double nScaleX = HMM_PER_TWIPS;
513*cdf0e10cSrcweir 	const double nScaleY = HMM_PER_TWIPS;
514*cdf0e10cSrcweir 
515*cdf0e10cSrcweir 	// from left to right:
516*cdf0e10cSrcweir 	sal_Bool bHasHeaderCol = sal_False;
517*cdf0e10cSrcweir 	sal_Bool bHasRepCols   = sal_False;
518*cdf0e10cSrcweir 	sal_Bool bHasMainCols  = sal_False;
519*cdf0e10cSrcweir 	SCCOL nRepeatColStart = 0;
520*cdf0e10cSrcweir 	SCCOL nRepeatColEnd   = 0;
521*cdf0e10cSrcweir 	SCCOL nMainColStart   = 0;
522*cdf0e10cSrcweir 	SCCOL nMainColEnd     = 0;
523*cdf0e10cSrcweir 
524*cdf0e10cSrcweir 	// from top to bottom:
525*cdf0e10cSrcweir 	sal_Bool bHasHeaderRow = sal_False;
526*cdf0e10cSrcweir 	sal_Bool bHasRepRows   = sal_False;
527*cdf0e10cSrcweir 	sal_Bool bHasMainRows  = sal_False;
528*cdf0e10cSrcweir 	SCROW nRepeatRowStart = 0;
529*cdf0e10cSrcweir 	SCROW nRepeatRowEnd   = 0;
530*cdf0e10cSrcweir 	SCROW nMainRowStart   = 0;
531*cdf0e10cSrcweir 	SCROW nMainRowEnd     = 0;
532*cdf0e10cSrcweir 
533*cdf0e10cSrcweir 	Rectangle aHeaderRect, aRepeatRect, aMainRect;
534*cdf0e10cSrcweir 	SCTAB nTab = 0;
535*cdf0e10cSrcweir 
536*cdf0e10cSrcweir 	sal_uLong nCount = aEntries.Count();
537*cdf0e10cSrcweir 	for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
538*cdf0e10cSrcweir 	{
539*cdf0e10cSrcweir 		ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
540*cdf0e10cSrcweir 		if ( pEntry->eType == SC_PLOC_CELLRANGE )
541*cdf0e10cSrcweir 		{
542*cdf0e10cSrcweir 			if ( pEntry->bRepeatCol )
543*cdf0e10cSrcweir 			{
544*cdf0e10cSrcweir 				bHasRepCols = sal_True;
545*cdf0e10cSrcweir 				nRepeatColStart = pEntry->aCellRange.aStart.Col();
546*cdf0e10cSrcweir 				nRepeatColEnd = pEntry->aCellRange.aEnd.Col();
547*cdf0e10cSrcweir 				aRepeatRect.Left() = pEntry->aPixelRect.Left();
548*cdf0e10cSrcweir 				aRepeatRect.Right() = pEntry->aPixelRect.Right();
549*cdf0e10cSrcweir 			}
550*cdf0e10cSrcweir 			else
551*cdf0e10cSrcweir 			{
552*cdf0e10cSrcweir 				bHasMainCols = sal_True;
553*cdf0e10cSrcweir 				nMainColStart = pEntry->aCellRange.aStart.Col();
554*cdf0e10cSrcweir 				nMainColEnd = pEntry->aCellRange.aEnd.Col();
555*cdf0e10cSrcweir 				aMainRect.Left() = pEntry->aPixelRect.Left();
556*cdf0e10cSrcweir 				aMainRect.Right() = pEntry->aPixelRect.Right();
557*cdf0e10cSrcweir 			}
558*cdf0e10cSrcweir 			if ( pEntry->bRepeatRow )
559*cdf0e10cSrcweir 			{
560*cdf0e10cSrcweir 				bHasRepRows = sal_True;
561*cdf0e10cSrcweir 				nRepeatRowStart = pEntry->aCellRange.aStart.Row();
562*cdf0e10cSrcweir 				nRepeatRowEnd = pEntry->aCellRange.aEnd.Row();
563*cdf0e10cSrcweir 				aRepeatRect.Top() = pEntry->aPixelRect.Top();
564*cdf0e10cSrcweir 				aRepeatRect.Bottom() = pEntry->aPixelRect.Bottom();
565*cdf0e10cSrcweir 			}
566*cdf0e10cSrcweir 			else
567*cdf0e10cSrcweir 			{
568*cdf0e10cSrcweir 				bHasMainRows = sal_True;
569*cdf0e10cSrcweir 				nMainRowStart = pEntry->aCellRange.aStart.Row();
570*cdf0e10cSrcweir 				nMainRowEnd = pEntry->aCellRange.aEnd.Row();
571*cdf0e10cSrcweir 				aMainRect.Top() = pEntry->aPixelRect.Top();
572*cdf0e10cSrcweir 				aMainRect.Bottom() = pEntry->aPixelRect.Bottom();
573*cdf0e10cSrcweir 			}
574*cdf0e10cSrcweir 			nTab = pEntry->aCellRange.aStart.Tab();		//! store separately?
575*cdf0e10cSrcweir 		}
576*cdf0e10cSrcweir 		else if ( pEntry->eType == SC_PLOC_ROWHEADER )
577*cdf0e10cSrcweir 		{
578*cdf0e10cSrcweir 			// row headers result in an additional column
579*cdf0e10cSrcweir 			bHasHeaderCol = sal_True;
580*cdf0e10cSrcweir 			aHeaderRect.Left() = pEntry->aPixelRect.Left();
581*cdf0e10cSrcweir 			aHeaderRect.Right() = pEntry->aPixelRect.Right();
582*cdf0e10cSrcweir 		}
583*cdf0e10cSrcweir 		else if ( pEntry->eType == SC_PLOC_COLHEADER )
584*cdf0e10cSrcweir 		{
585*cdf0e10cSrcweir 			// column headers result in an additional row
586*cdf0e10cSrcweir 			bHasHeaderRow = sal_True;
587*cdf0e10cSrcweir 			aHeaderRect.Top() = pEntry->aPixelRect.Top();
588*cdf0e10cSrcweir 			aHeaderRect.Bottom() = pEntry->aPixelRect.Bottom();
589*cdf0e10cSrcweir 		}
590*cdf0e10cSrcweir 	}
591*cdf0e10cSrcweir 
592*cdf0e10cSrcweir 	//
593*cdf0e10cSrcweir 	//	get column info
594*cdf0e10cSrcweir 	//
595*cdf0e10cSrcweir 
596*cdf0e10cSrcweir 	SCCOL nColCount = 0;
597*cdf0e10cSrcweir 	SCCOL nCol;
598*cdf0e10cSrcweir 	if ( bHasHeaderCol )
599*cdf0e10cSrcweir 		++nColCount;
600*cdf0e10cSrcweir 	if ( bHasRepCols )
601*cdf0e10cSrcweir 		for ( nCol=nRepeatColStart; nCol<=nRepeatColEnd; nCol++ )
602*cdf0e10cSrcweir             if (!pDoc->ColHidden(nCol, nTab))
603*cdf0e10cSrcweir 				++nColCount;
604*cdf0e10cSrcweir 	if ( bHasMainCols )
605*cdf0e10cSrcweir 		for ( nCol=nMainColStart; nCol<=nMainColEnd; nCol++ )
606*cdf0e10cSrcweir             if (!pDoc->ColHidden(nCol, nTab))
607*cdf0e10cSrcweir 				++nColCount;
608*cdf0e10cSrcweir 
609*cdf0e10cSrcweir 	if ( nColCount > 0 )
610*cdf0e10cSrcweir 	{
611*cdf0e10cSrcweir 		ScPreviewColRowInfo* pColInfo = new ScPreviewColRowInfo[ nColCount ];
612*cdf0e10cSrcweir 		SCCOL nColPos = 0;
613*cdf0e10cSrcweir 
614*cdf0e10cSrcweir 		if ( bHasHeaderCol )
615*cdf0e10cSrcweir 		{
616*cdf0e10cSrcweir 			pColInfo[nColPos].Set( sal_True, 0, aHeaderRect.Left(), aHeaderRect.Right() );
617*cdf0e10cSrcweir 			++nColPos;
618*cdf0e10cSrcweir 		}
619*cdf0e10cSrcweir 		if ( bHasRepCols )
620*cdf0e10cSrcweir 		{
621*cdf0e10cSrcweir 			long nPosX = 0;
622*cdf0e10cSrcweir 			for ( nCol=nRepeatColStart; nCol<=nRepeatColEnd; nCol++ )
623*cdf0e10cSrcweir                 if (!pDoc->ColHidden(nCol, nTab))
624*cdf0e10cSrcweir 				{
625*cdf0e10cSrcweir 					sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nTab );
626*cdf0e10cSrcweir 					long nNextX = nPosX + (long) (nDocW * nScaleX);
627*cdf0e10cSrcweir 
628*cdf0e10cSrcweir 					long nPixelStart = pWindow->LogicToPixel( Size( nPosX, 0 ), aCellMapMode ).Width();
629*cdf0e10cSrcweir 					long nPixelEnd = pWindow->LogicToPixel( Size( nNextX, 0 ), aCellMapMode ).Width() - 1;
630*cdf0e10cSrcweir 					pColInfo[nColPos].Set( sal_False, nCol,
631*cdf0e10cSrcweir 												aRepeatRect.Left() + nPixelStart,
632*cdf0e10cSrcweir 												aRepeatRect.Left() + nPixelEnd );
633*cdf0e10cSrcweir 
634*cdf0e10cSrcweir 					nPosX = nNextX;
635*cdf0e10cSrcweir 					++nColPos;
636*cdf0e10cSrcweir 				}
637*cdf0e10cSrcweir 		}
638*cdf0e10cSrcweir 		if ( bHasMainCols )
639*cdf0e10cSrcweir 		{
640*cdf0e10cSrcweir 			long nPosX = 0;
641*cdf0e10cSrcweir 			for ( nCol=nMainColStart; nCol<=nMainColEnd; nCol++ )
642*cdf0e10cSrcweir                 if (!pDoc->ColHidden(nCol, nTab))
643*cdf0e10cSrcweir 				{
644*cdf0e10cSrcweir 					sal_uInt16 nDocW = pDoc->GetColWidth( nCol, nTab );
645*cdf0e10cSrcweir 					long nNextX = nPosX + (long) (nDocW * nScaleX);
646*cdf0e10cSrcweir 
647*cdf0e10cSrcweir 					long nPixelStart = pWindow->LogicToPixel( Size( nPosX, 0 ), aCellMapMode ).Width();
648*cdf0e10cSrcweir 					long nPixelEnd = pWindow->LogicToPixel( Size( nNextX, 0 ), aCellMapMode ).Width() - 1;
649*cdf0e10cSrcweir 					pColInfo[nColPos].Set( sal_False, nCol,
650*cdf0e10cSrcweir 												aMainRect.Left() + nPixelStart,
651*cdf0e10cSrcweir 												aMainRect.Left() + nPixelEnd );
652*cdf0e10cSrcweir 
653*cdf0e10cSrcweir 					nPosX = nNextX;
654*cdf0e10cSrcweir 					++nColPos;
655*cdf0e10cSrcweir 				}
656*cdf0e10cSrcweir 		}
657*cdf0e10cSrcweir 		rInfo.SetColInfo( nColCount, pColInfo );
658*cdf0e10cSrcweir 	}
659*cdf0e10cSrcweir 	else
660*cdf0e10cSrcweir 		rInfo.SetColInfo( 0, NULL );
661*cdf0e10cSrcweir 
662*cdf0e10cSrcweir 	//
663*cdf0e10cSrcweir 	//	get row info
664*cdf0e10cSrcweir 	//
665*cdf0e10cSrcweir 
666*cdf0e10cSrcweir 	SCROW nRowCount = 0;
667*cdf0e10cSrcweir 	if ( bHasHeaderRow )
668*cdf0e10cSrcweir 		++nRowCount;
669*cdf0e10cSrcweir 	if ( bHasRepRows )
670*cdf0e10cSrcweir         nRowCount += pDoc->CountVisibleRows(nRepeatRowStart, nRepeatRowEnd, nTab);
671*cdf0e10cSrcweir 	if ( bHasMainRows )
672*cdf0e10cSrcweir         nRowCount += pDoc->CountVisibleRows(nMainRowStart, nMainRowEnd, nTab);
673*cdf0e10cSrcweir 
674*cdf0e10cSrcweir 	if ( nRowCount > 0 )
675*cdf0e10cSrcweir 	{
676*cdf0e10cSrcweir 		ScPreviewColRowInfo* pRowInfo = new ScPreviewColRowInfo[ nRowCount ];
677*cdf0e10cSrcweir 		SCROW nRowPos = 0;
678*cdf0e10cSrcweir 
679*cdf0e10cSrcweir 		if ( bHasHeaderRow )
680*cdf0e10cSrcweir 		{
681*cdf0e10cSrcweir 			pRowInfo[nRowPos].Set( sal_True, 0, aHeaderRect.Top(), aHeaderRect.Bottom() );
682*cdf0e10cSrcweir 			++nRowPos;
683*cdf0e10cSrcweir 		}
684*cdf0e10cSrcweir 		if ( bHasRepRows )
685*cdf0e10cSrcweir 		{
686*cdf0e10cSrcweir 			long nPosY = 0;
687*cdf0e10cSrcweir             for (SCROW nRow = nRepeatRowStart; nRow <= nRepeatRowEnd; ++nRow)
688*cdf0e10cSrcweir             {
689*cdf0e10cSrcweir                 if (pDoc->RowHidden(nRow, nTab))
690*cdf0e10cSrcweir                     continue;
691*cdf0e10cSrcweir 
692*cdf0e10cSrcweir                 sal_uInt16 nDocH = pDoc->GetOriginalHeight( nRow, nTab );
693*cdf0e10cSrcweir                 long nNextY = nPosY + (long) (nDocH * nScaleY);
694*cdf0e10cSrcweir 
695*cdf0e10cSrcweir                 long nPixelStart = pWindow->LogicToPixel( Size( 0, nPosY ), aCellMapMode ).Height();
696*cdf0e10cSrcweir                 long nPixelEnd = pWindow->LogicToPixel( Size( 0, nNextY ), aCellMapMode ).Height() - 1;
697*cdf0e10cSrcweir                 pRowInfo[nRowPos].Set( sal_False, nRow,
698*cdf0e10cSrcweir                         aRepeatRect.Top() + nPixelStart,
699*cdf0e10cSrcweir                         aRepeatRect.Top() + nPixelEnd );
700*cdf0e10cSrcweir 
701*cdf0e10cSrcweir                 nPosY = nNextY;
702*cdf0e10cSrcweir                 ++nRowPos;
703*cdf0e10cSrcweir             }
704*cdf0e10cSrcweir 		}
705*cdf0e10cSrcweir 		if ( bHasMainRows )
706*cdf0e10cSrcweir 		{
707*cdf0e10cSrcweir 			long nPosY = 0;
708*cdf0e10cSrcweir             for (SCROW nRow = nMainRowStart; nRow <= nMainRowEnd; ++nRow)
709*cdf0e10cSrcweir             {
710*cdf0e10cSrcweir                 if (pDoc->RowHidden(nRow, nTab))
711*cdf0e10cSrcweir                     continue;
712*cdf0e10cSrcweir 
713*cdf0e10cSrcweir                 sal_uInt16 nDocH = pDoc->GetOriginalHeight( nRow, nTab );
714*cdf0e10cSrcweir                 long nNextY = nPosY + (long) (nDocH * nScaleY);
715*cdf0e10cSrcweir 
716*cdf0e10cSrcweir                 long nPixelStart = pWindow->LogicToPixel( Size( 0, nPosY ), aCellMapMode ).Height();
717*cdf0e10cSrcweir                 long nPixelEnd = pWindow->LogicToPixel( Size( 0, nNextY ), aCellMapMode ).Height() - 1;
718*cdf0e10cSrcweir                 pRowInfo[nRowPos].Set( sal_False, nRow,
719*cdf0e10cSrcweir                         aMainRect.Top() + nPixelStart,
720*cdf0e10cSrcweir                         aMainRect.Top() + nPixelEnd );
721*cdf0e10cSrcweir 
722*cdf0e10cSrcweir                 nPosY = nNextY;
723*cdf0e10cSrcweir                 ++nRowPos;
724*cdf0e10cSrcweir             }
725*cdf0e10cSrcweir 		}
726*cdf0e10cSrcweir 		rInfo.SetRowInfo( nRowCount, pRowInfo );
727*cdf0e10cSrcweir 	}
728*cdf0e10cSrcweir 	else
729*cdf0e10cSrcweir 		rInfo.SetRowInfo( 0, NULL );
730*cdf0e10cSrcweir 
731*cdf0e10cSrcweir 	//
732*cdf0e10cSrcweir 	//	limit to visible area
733*cdf0e10cSrcweir 	//
734*cdf0e10cSrcweir 
735*cdf0e10cSrcweir 	rInfo.SetTab( nTab );
736*cdf0e10cSrcweir 	rInfo.LimitToArea( rVisiblePixel );
737*cdf0e10cSrcweir }
738*cdf0e10cSrcweir 
739*cdf0e10cSrcweir Rectangle ScPreviewLocationData::GetHeaderCellOutputRect(const Rectangle& rVisRect, const ScAddress& rCellPos, sal_Bool bColHeader) const
740*cdf0e10cSrcweir {
741*cdf0e10cSrcweir 	// first a stupid implementation
742*cdf0e10cSrcweir 	// NN says here should be done more
743*cdf0e10cSrcweir 	Rectangle aClipRect;
744*cdf0e10cSrcweir 	ScPreviewTableInfo aTableInfo;
745*cdf0e10cSrcweir 	GetTableInfo( rVisRect, aTableInfo );
746*cdf0e10cSrcweir 
747*cdf0e10cSrcweir 	if ( (rCellPos.Col() >= 0) &&
748*cdf0e10cSrcweir 		(rCellPos.Row() >= 0) && (rCellPos.Col() < aTableInfo.GetCols()) &&
749*cdf0e10cSrcweir 		(rCellPos.Row() < aTableInfo.GetRows()) )
750*cdf0e10cSrcweir 	{
751*cdf0e10cSrcweir 		SCCOL nCol(0);
752*cdf0e10cSrcweir 		SCROW nRow(0);
753*cdf0e10cSrcweir 		if (bColHeader)
754*cdf0e10cSrcweir 			nCol = rCellPos.Col();
755*cdf0e10cSrcweir 		else
756*cdf0e10cSrcweir 			nRow = rCellPos.Row();
757*cdf0e10cSrcweir 		const ScPreviewColRowInfo& rColInfo = aTableInfo.GetColInfo()[nCol];
758*cdf0e10cSrcweir 		const ScPreviewColRowInfo& rRowInfo = aTableInfo.GetRowInfo()[nRow];
759*cdf0e10cSrcweir 
760*cdf0e10cSrcweir 		if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
761*cdf0e10cSrcweir 			aClipRect = Rectangle( rColInfo.nPixelStart, rRowInfo.nPixelStart, rColInfo.nPixelEnd, rRowInfo.nPixelEnd );
762*cdf0e10cSrcweir 	}
763*cdf0e10cSrcweir 	return aClipRect;
764*cdf0e10cSrcweir }
765*cdf0e10cSrcweir 
766*cdf0e10cSrcweir Rectangle ScPreviewLocationData::GetCellOutputRect(const ScAddress& rCellPos) const
767*cdf0e10cSrcweir {
768*cdf0e10cSrcweir 	// first a stupid implementation
769*cdf0e10cSrcweir 	// NN says here should be done more
770*cdf0e10cSrcweir 	Rectangle aRect;
771*cdf0e10cSrcweir 	GetCellPosition(rCellPos, aRect);
772*cdf0e10cSrcweir 	return aRect;
773*cdf0e10cSrcweir }
774*cdf0e10cSrcweir 
775*cdf0e10cSrcweir // GetMainCellRange is used for links in PDF export
776*cdf0e10cSrcweir 
777*cdf0e10cSrcweir sal_Bool ScPreviewLocationData::GetMainCellRange( ScRange& rRange, Rectangle& rPixRect ) const
778*cdf0e10cSrcweir {
779*cdf0e10cSrcweir     sal_uLong nCount = aEntries.Count();
780*cdf0e10cSrcweir     for (sal_uLong nListPos=0; nListPos<nCount; nListPos++)
781*cdf0e10cSrcweir     {
782*cdf0e10cSrcweir         ScPreviewLocationEntry* pEntry = (ScPreviewLocationEntry*)aEntries.GetObject(nListPos);
783*cdf0e10cSrcweir         if ( pEntry->eType == SC_PLOC_CELLRANGE && !pEntry->bRepeatCol && !pEntry->bRepeatRow )
784*cdf0e10cSrcweir         {
785*cdf0e10cSrcweir             rRange = pEntry->aCellRange;
786*cdf0e10cSrcweir             rPixRect = pEntry->aPixelRect;
787*cdf0e10cSrcweir             return sal_True;
788*cdf0e10cSrcweir         }
789*cdf0e10cSrcweir     }
790*cdf0e10cSrcweir     return sal_False;       // not found
791*cdf0e10cSrcweir }
792*cdf0e10cSrcweir 
793