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