2010-10-14 08:30:41 +02:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
2001-05-29 11:41:34 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
2008-04-10 13:46:34 +00:00
|
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
2010-02-12 15:01:35 +01:00
|
|
|
* Copyright 2000, 2010 Oracle and/or its affiliates.
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
2008-04-10 13:46:34 +00:00
|
|
|
* OpenOffice.org - a multi-platform office productivity suite
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
2008-04-10 13:46:34 +00:00
|
|
|
* This file is part of OpenOffice.org.
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
2008-04-10 13:46:34 +00:00
|
|
|
* OpenOffice.org is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU Lesser General Public License version 3
|
|
|
|
* only, as published by the Free Software Foundation.
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
2008-04-10 13:46:34 +00:00
|
|
|
* OpenOffice.org is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU Lesser General Public License version 3 for more details
|
|
|
|
* (a copy is included in the LICENSE file that accompanied this code).
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
2008-04-10 13:46:34 +00:00
|
|
|
* You should have received a copy of the GNU Lesser General Public License
|
|
|
|
* version 3 along with OpenOffice.org. If not, see
|
|
|
|
* <http://www.openoffice.org/license.html>
|
|
|
|
* for a copy of the LGPLv3 License.
|
2001-05-29 11:41:34 +00:00
|
|
|
*
|
|
|
|
************************************************************************/
|
2012-01-09 20:37:49 -05:00
|
|
|
|
2012-07-25 12:37:48 +02:00
|
|
|
#ifndef SW_LAYHELP_HXX
|
|
|
|
#define SW_LAYHELP_HXX
|
|
|
|
|
2001-06-29 06:58:06 +00:00
|
|
|
#include <swrect.hxx>
|
2011-02-03 16:09:53 +00:00
|
|
|
#include <vector>
|
2012-07-25 12:37:48 +02:00
|
|
|
#include <deque>
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
class SwDoc;
|
|
|
|
class SwFrm;
|
|
|
|
class SwLayoutFrm;
|
|
|
|
class SwPageFrm;
|
2001-06-29 06:58:06 +00:00
|
|
|
class SwFlyFrm;
|
2001-05-29 11:41:34 +00:00
|
|
|
class SwSectionFrm;
|
|
|
|
class SwSectionNode;
|
|
|
|
class SvStream;
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* class SwLayCacheImpl
|
2001-06-29 06:58:06 +00:00
|
|
|
* contains the page break information and the text frame positions
|
|
|
|
* of the document (after loading)
|
2001-05-29 11:41:34 +00:00
|
|
|
* and is used inside the constructor of the layout rootframe to
|
2001-06-29 06:58:06 +00:00
|
|
|
* insert content and text frames at the right pages.
|
2001-05-29 11:41:34 +00:00
|
|
|
* For every page of the main text (body content, no footnotes, text frames etc.)
|
|
|
|
* we have the nodeindex of the first content at the page,
|
|
|
|
* the type of content ( table or paragraph )
|
|
|
|
* and if it's not the first part of the table/paragraph,
|
|
|
|
* the row/character-offset inside the table/paragraph.
|
2001-06-29 06:58:06 +00:00
|
|
|
* The text frame positions are stored in the SwPageFlyCache array.
|
2001-05-29 11:41:34 +00:00
|
|
|
*************************************************************************/
|
|
|
|
|
2001-06-29 06:58:06 +00:00
|
|
|
class SwFlyCache;
|
2012-04-26 10:04:46 +02:00
|
|
|
typedef boost::ptr_vector<SwFlyCache> SwPageFlyCache;
|
2001-06-29 06:58:06 +00:00
|
|
|
|
2011-06-17 15:20:07 +01:00
|
|
|
class SwLayCacheImpl : public std::vector<sal_uLong>
|
2001-05-29 11:41:34 +00:00
|
|
|
{
|
2012-07-25 12:37:48 +02:00
|
|
|
std::deque<xub_StrLen> aOffset;
|
2011-07-25 16:44:02 +01:00
|
|
|
std::vector<sal_uInt16> aType;
|
2001-06-29 06:58:06 +00:00
|
|
|
SwPageFlyCache aFlyCache;
|
2012-11-27 20:49:30 +09:00
|
|
|
bool bUseFlyCache;
|
2011-01-17 15:06:54 +01:00
|
|
|
void Insert( sal_uInt16 nType, sal_uLong nIndex, xub_StrLen nOffset );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
public:
|
2011-07-25 16:44:02 +01:00
|
|
|
SwLayCacheImpl() {}
|
2012-11-27 20:49:30 +09:00
|
|
|
bool Read( SvStream& rStream );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
2011-06-17 15:20:07 +01:00
|
|
|
sal_uLong GetBreakIndex( sal_uInt16 nIdx ) const { return std::vector<sal_uLong>::operator[]( nIdx ); }
|
2010-10-05 20:01:23 +02:00
|
|
|
xub_StrLen GetBreakOfst( size_t nIdx ) const { return aOffset[ nIdx ]; }
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 GetBreakType( sal_uInt16 nIdx ) const { return aType[ nIdx ]; }
|
2001-06-29 06:58:06 +00:00
|
|
|
|
2012-04-26 10:04:46 +02:00
|
|
|
sal_uInt16 GetFlyCount() const { return aFlyCache.size(); }
|
|
|
|
SwFlyCache *GetFlyCache( sal_uInt16 nIdx ) { return &aFlyCache[ nIdx ]; }
|
2003-04-17 15:07:40 +00:00
|
|
|
|
2012-11-27 20:49:30 +09:00
|
|
|
bool IsUseFlyCache() const { return bUseFlyCache; }
|
2001-05-29 11:41:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* class SwActualSection
|
|
|
|
* helps to create the sectionframes during the _InsertCnt-function
|
|
|
|
* by controlling nested sections.
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
class SwActualSection
|
|
|
|
{
|
|
|
|
SwActualSection *pUpper;
|
|
|
|
SwSectionFrm *pSectFrm;
|
|
|
|
SwSectionNode *pSectNode;
|
|
|
|
public:
|
|
|
|
SwActualSection( SwActualSection *pUpper,
|
|
|
|
SwSectionFrm *pSect,
|
|
|
|
SwSectionNode *pNd );
|
|
|
|
|
|
|
|
SwSectionFrm *GetSectionFrm() { return pSectFrm; }
|
|
|
|
void SetSectionFrm( SwSectionFrm *p ) { pSectFrm = p; }
|
|
|
|
SwSectionNode *GetSectionNode() { return pSectNode;}
|
|
|
|
SwActualSection *GetUpper() { return pUpper; }
|
|
|
|
};
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* class SwLayHelper
|
|
|
|
* helps during the _InsertCnt-function to create new pages.
|
|
|
|
* If there's a layoutcache available, this information is used.
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
class SwLayHelper
|
|
|
|
{
|
|
|
|
SwFrm* &rpFrm;
|
|
|
|
SwFrm* &rpPrv;
|
|
|
|
SwPageFrm* &rpPage;
|
|
|
|
SwLayoutFrm* &rpLay;
|
|
|
|
SwActualSection* &rpActualSection;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_Bool &rbBreakAfter;
|
2001-05-29 11:41:34 +00:00
|
|
|
SwDoc* pDoc;
|
|
|
|
SwLayCacheImpl* pImpl;
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nMaxParaPerPage;
|
|
|
|
sal_uLong nParagraphCnt;
|
|
|
|
sal_uLong nStartOfContent;
|
|
|
|
sal_uInt16 nIndex; // the index in the page break array
|
|
|
|
sal_uInt16 nFlyIdx; // the index in the fly cache array
|
2012-11-27 20:49:30 +09:00
|
|
|
bool bFirst : 1;
|
2001-06-29 06:58:06 +00:00
|
|
|
void _CheckFlyCache( SwPageFrm* pPage );
|
2001-05-29 11:41:34 +00:00
|
|
|
public:
|
|
|
|
SwLayHelper( SwDoc *pD, SwFrm* &rpF, SwFrm* &rpP, SwPageFrm* &rpPg,
|
2011-01-17 15:06:54 +01:00
|
|
|
SwLayoutFrm* &rpL, SwActualSection* &rpA, sal_Bool &rBrk,
|
2012-11-27 20:49:30 +09:00
|
|
|
sal_uLong nNodeIndex, bool bCache );
|
2001-05-29 11:41:34 +00:00
|
|
|
~SwLayHelper();
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong CalcPageCount();
|
2012-11-27 20:49:30 +09:00
|
|
|
bool CheckInsert( sal_uLong nNodeIndex );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
2012-11-27 20:49:30 +09:00
|
|
|
bool CheckInsertPage();
|
2001-05-29 11:41:34 +00:00
|
|
|
|
2001-06-29 06:58:06 +00:00
|
|
|
// Look for fresh text frames at this (new) page and set them to the right
|
|
|
|
// position, if they are in the fly cache.
|
|
|
|
void CheckFlyCache( SwPageFrm* pPage )
|
|
|
|
{ if( pImpl && nFlyIdx < pImpl->GetFlyCount() ) _CheckFlyCache( pPage ); }
|
|
|
|
|
|
|
|
// Look for this text frame and set it to the right position,
|
|
|
|
// if it's in the fly cache.
|
2012-11-27 20:49:30 +09:00
|
|
|
static bool CheckPageFlyCache( SwPageFrm* &rpPage, SwFlyFrm* pFly );
|
2001-05-29 11:41:34 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
/*************************************************************************
|
|
|
|
* class SwLayCacheIoImpl
|
|
|
|
* contains the data structures that are required to read and write a
|
|
|
|
* layout cache.
|
|
|
|
*************************************************************************/
|
|
|
|
|
|
|
|
#define SW_LAYCACHE_IO_REC_PAGES 'p'
|
|
|
|
#define SW_LAYCACHE_IO_REC_PARA 'P'
|
|
|
|
#define SW_LAYCACHE_IO_REC_TABLE 'T'
|
2001-06-29 06:58:06 +00:00
|
|
|
#define SW_LAYCACHE_IO_REC_FLY 'F'
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
#define SW_LAYCACHE_IO_VERSION_MAJOR 1
|
2003-04-17 15:07:40 +00:00
|
|
|
#define SW_LAYCACHE_IO_VERSION_MINOR 1
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
class SwLayCacheIoImpl
|
|
|
|
{
|
2011-02-03 16:09:53 +00:00
|
|
|
private:
|
|
|
|
struct RecTypeSize {
|
2011-03-14 16:51:14 +00:00
|
|
|
sal_uInt8 type;
|
|
|
|
sal_uLong size;
|
|
|
|
RecTypeSize(sal_uInt8 typ, sal_uLong siz) : type(typ), size(siz) {}
|
2011-02-03 16:09:53 +00:00
|
|
|
};
|
|
|
|
std::vector<RecTypeSize> aRecords;
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
SvStream *pStream;
|
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nFlagRecEnd;
|
2001-05-29 11:41:34 +00:00
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 nMajorVersion;
|
|
|
|
sal_uInt16 nMinorVersion;
|
2001-05-29 11:41:34 +00:00
|
|
|
|
2012-11-27 20:49:30 +09:00
|
|
|
bool bWriteMode : 1;
|
|
|
|
bool bError : 1;
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
public:
|
2012-11-27 20:49:30 +09:00
|
|
|
SwLayCacheIoImpl( SvStream& rStrm, bool bWrtMd );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Get input or output stream
|
|
|
|
SvStream& GetStream() const { return *pStream; }
|
|
|
|
|
|
|
|
// Open a record of type "nType"
|
2012-11-27 20:49:30 +09:00
|
|
|
bool OpenRec( sal_uInt8 nType );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Close a record of type "nType". This skips any unread data that
|
|
|
|
// remains in the record.
|
2012-11-27 20:49:30 +09:00
|
|
|
bool CloseRec( sal_uInt8 nType );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Return the number of bytes contained in the current record that
|
|
|
|
// haven't been read by now.
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt32 BytesLeft();
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Return the current record's type
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 Peek();
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Skip the current record
|
|
|
|
void SkipRec();
|
|
|
|
|
|
|
|
// Open a flag record for reading. The uppermost four bits are flags,
|
|
|
|
// while the lowermost are the flag record's size. Flag records cannot
|
|
|
|
// be nested.
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt8 OpenFlagRec();
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Open flag record for writing;
|
2011-01-17 15:06:54 +01:00
|
|
|
void OpenFlagRec( sal_uInt8 nFlags, sal_uInt8 nLen );
|
2001-05-29 11:41:34 +00:00
|
|
|
|
|
|
|
// Close a flag record. Any bytes left are skipped.
|
|
|
|
void CloseFlagRec();
|
|
|
|
|
2012-11-27 20:49:30 +09:00
|
|
|
bool HasError() const { return bError; }
|
2001-05-29 11:41:34 +00:00
|
|
|
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uInt16 GetMajorVersion() const { return nMajorVersion; }
|
|
|
|
sal_uInt16 GetMinorVersion() const { return nMinorVersion; }
|
2001-05-29 11:41:34 +00:00
|
|
|
};
|
|
|
|
|
2001-06-29 06:58:06 +00:00
|
|
|
// Stored information about text frames:
|
|
|
|
class SwFlyCache : public SwRect // position and size
|
|
|
|
{
|
|
|
|
public:
|
2011-01-17 15:06:54 +01:00
|
|
|
sal_uLong nOrdNum; // Id to recognize text frames
|
|
|
|
sal_uInt16 nPageNum; // page number
|
|
|
|
SwFlyCache( sal_uInt16 nP, sal_uLong nO, long nXL, long nYL, long nWL, long nHL ) :
|
2007-09-27 08:04:04 +00:00
|
|
|
SwRect( nXL, nYL, nWL, nHL ), nOrdNum( nO ), nPageNum( nP ){}
|
2001-06-29 06:58:06 +00:00
|
|
|
};
|
|
|
|
|
2001-05-29 11:41:34 +00:00
|
|
|
#endif
|
2010-10-14 08:30:41 +02:00
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|