Files
libreoffice/sw/source/core/inc/docfld.hxx
pkoroau pkoroau 7a5272dc29 fdo#38837: Timers must end eventually [Writer idle timer]
Change-Id: I36c6c56d7277b9b3853b846c86c1f4dd47ebdb08
Signed-off-by: Luboš Luňák <l.lunak@suse.cz>
2012-12-20 12:18:57 +01:00

192 lines
6.0 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
* This file is part of the LibreOffice project.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#ifndef _DOCFLD_HXX
#define _DOCFLD_HXX
#include <calc.hxx>
#include <doc.hxx>
#include <o3tl/sorted_vector.hxx>
class SwTxtFld;
class SwIndex;
class SwNodeIndex;
class SwCntntFrm;
class SwSectionNode;
class SwSection;
class SwTxtTOXMark;
class SwTableBox;
class SwTxtINetFmt;
class SwFlyFrmFmt;
class SwDoc;
class SwNode;
struct SwPosition;
// Update expression fields
class _SetGetExpFld
{
sal_uLong nNode;
xub_StrLen nCntnt;
union {
const SwTxtFld* pTxtFld;
const SwSection* pSection;
const SwPosition* pPos;
const SwTxtTOXMark* pTxtTOX;
const SwTableBox* pTBox;
const SwTxtINetFmt* pTxtINet;
const SwFlyFrmFmt* pFlyFmt;
} CNTNT;
enum _SetGetExpFldType
{
TEXTFIELD, TEXTTOXMARK, SECTIONNODE, CRSRPOS, TABLEBOX,
TEXTINET, FLYFRAME
} eSetGetExpFldType;
public:
_SetGetExpFld( const SwNodeIndex& rNdIdx, const SwTxtFld* pFld = 0,
const SwIndex* pIdx = 0 );
_SetGetExpFld( const SwNodeIndex& rNdIdx, const SwTxtINetFmt& rINet,
const SwIndex* pIdx = 0 );
_SetGetExpFld( const SwSectionNode& rSectNode,
const SwPosition* pPos = 0 );
_SetGetExpFld( const SwTableBox& rTableBox,
const SwPosition* pPos = 0 );
_SetGetExpFld( const SwNodeIndex& rNdIdx, const SwTxtTOXMark& rTOX,
const SwIndex* pIdx );
_SetGetExpFld( const SwPosition& rPos );
_SetGetExpFld( const SwFlyFrmFmt& rFlyFmt, const SwPosition* pPos = 0 );
bool operator==( const _SetGetExpFld& rFld ) const
{ return nNode == rFld.nNode && nCntnt == rFld.nCntnt &&
( !CNTNT.pTxtFld || !rFld.CNTNT.pTxtFld ||
CNTNT.pTxtFld == rFld.CNTNT.pTxtFld ); }
bool operator<( const _SetGetExpFld& rFld ) const;
const SwTxtFld* GetFld() const
{ return TEXTFIELD == eSetGetExpFldType ? CNTNT.pTxtFld : 0; }
const SwTxtTOXMark* GetTOX() const
{ return TEXTTOXMARK == eSetGetExpFldType ? CNTNT.pTxtTOX : 0; }
const SwSection* GetSection() const
{ return SECTIONNODE == eSetGetExpFldType ? CNTNT.pSection : 0; }
const SwTableBox* GetTableBox() const
{ return TABLEBOX == eSetGetExpFldType ? CNTNT.pTBox : 0; }
const SwTxtINetFmt* GetINetFmt() const
{ return TEXTINET == eSetGetExpFldType ? CNTNT.pTxtINet : 0; }
const SwFlyFrmFmt* GetFlyFmt() const
{ return FLYFRAME == eSetGetExpFldType ? CNTNT.pFlyFmt : 0; }
sal_uLong GetNode() const { return nNode; }
xub_StrLen GetCntnt() const { return nCntnt; }
const void* GetPointer() const { return CNTNT.pTxtFld; }
void GetPos( SwPosition& rPos ) const;
void GetPosOfContent( SwPosition& rPos ) const;
const SwNode* GetNodeFromCntnt() const;
xub_StrLen GetCntPosFromCntnt() const;
void SetBodyPos( const SwCntntFrm& rFrm );
};
class _SetGetExpFlds : public o3tl::sorted_vector<_SetGetExpFld*, o3tl::less_ptr_to<_SetGetExpFld> >
{
public:
~_SetGetExpFlds() { DeleteAndDestroyAll(); }
};
// struct for saving strings from the SetExp's string fields
struct _HashStr : public SwHash
{
String aSetStr;
_HashStr( const String& rName, const String& rText, _HashStr* = 0 );
};
struct SwCalcFldType : public SwHash
{
const SwFieldType* pFldType;
SwCalcFldType( const String& rStr, const SwFieldType* pFldTyp )
: SwHash( rStr ), pFldType( pFldTyp )
{}
};
// search for the string that was saved under rName in the hash table
void LookString( SwHash** ppTbl, sal_uInt16 nSize, const String& rName,
String& rRet, sal_uInt16* pPos = 0 );
const int GETFLD_ALL = 3; // combine flags via OR
const int GETFLD_CALC = 1;
const int GETFLD_EXPAND = 2;
class SwDocUpdtFld
{
_SetGetExpFlds* pFldSortLst; // current field list for calculation
SwCalcFldType* aFldTypeTable[ TBLSZ ];
sal_uLong nNodes; // if the node count is different
sal_uInt8 nFldLstGetMode;
SwDoc* pDocument;
bool bInUpdateFlds : 1; // currently there is an UpdateFlds
bool bFldsDirty : 1; // some fields are invalid
void _MakeFldList( SwDoc& pDoc, int eGetMode );
void GetBodyNode( const SwTxtFld& , sal_uInt16 nFldWhich );
void GetBodyNode( const SwSectionNode&);
public:
SwDocUpdtFld(SwDoc* pDocument);
~SwDocUpdtFld();
const _SetGetExpFlds* GetSortLst() const { return pFldSortLst; }
void MakeFldList( SwDoc& rDoc, int bAll, int eGetMode );
void InsDelFldInFldLst( bool bIns, const SwTxtFld& rFld );
void InsertFldType( const SwFieldType& rType );
void RemoveFldType( const SwFieldType& rType );
bool IsInUpdateFlds() const { return bInUpdateFlds; }
void SetInUpdateFlds( bool b ) { bInUpdateFlds = b; }
bool IsFieldsDirty() const { return bFldsDirty; }
void SetFieldsDirty( bool b )
{
bFldsDirty = b;
if (b)
{
pDocument->StartBackgroundJobs();
}
}
SwHash** GetFldTypeTable() const { return (SwHash**)aFldTypeTable; }
};
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */