20 #include <config_features.h>
25 #include <osl/diagnose.h>
51 #include <section.hxx>
144 m_CNTNT.pFlyFormat = &rFlyFormat;
181 ? *
static_cast<SwTextFrame const&
>(rFrame).GetTextNodeFirst()
186 OSL_ENSURE(bResult,
"Where is the field?");
212 if( !pFirst || !pNext )
219 const SwNode *pFirstStt, *pNextStt;
232 if( pFirstStt != pNextStt )
234 if( pFirst->
IsTextNode() && pNext->IsTextNode() &&
252 if( pFirst != pNext )
253 return pFirst->
GetIndex() < pNext->GetIndex();
261 const SwNode* pRet =
nullptr;
266 pRet = &
m_CNTNT.pTextField->GetTextNode();
270 pRet = &
m_CNTNT.pTextINet->GetTextNode();
274 pRet =
m_CNTNT.pSection->GetFormat()->GetSectionNode();
278 pRet = &
m_CNTNT.pPos->nNode.GetNode();
282 pRet = &
m_CNTNT.pTextTOX->GetTextNode();
286 if(
m_CNTNT.pTBox->GetSttNd() )
310 nRet =
m_CNTNT.pTextField->GetStart();
313 nRet =
m_CNTNT.pTextINet->GetStart();
316 nRet =
m_CNTNT.pTextTOX->GetStart();
319 nRet =
m_CNTNT.pPos->nContent.GetIndex();
329 :
SwHash( rName ), aSetStr( rText )
351 #if HAVE_FEATURE_DBCONNECTIVITY
368 std::vector<SwFormatField*> vFields;
392 #if !HAVE_FEATURE_DBCONNECTIVITY
399 #if HAVE_FEATURE_DBCONNECTIVITY
402 static OUString lcl_DBDataToString(
const SwDBData& rData)
412 const std::vector<OUString>* pAllDBNames )
414 #if !HAVE_FEATURE_DBCONNECTIVITY
418 std::vector<OUString> aUsedDBNames;
419 std::vector<OUString> aAllDBNames;
424 pAllDBNames = &aAllDBNames;
428 for (
auto n = rArr.
size();
n; )
436 aUsedDBNames.clear();
454 lcl_DBDataToString(static_cast<const SwDBField*>(pField)->
GetDBData() ));
460 lcl_DBDataToString(static_cast<const SwDBNameInfField*>(pField)->GetRealDBData() ));
466 lcl_DBDataToString(static_cast<const SwDBNameInfField*>(pField)->GetRealDBData() ));
472 pField->
GetPar1(), aUsedDBNames ));
473 aUsedDBNames.clear();
481 aUsedDBNames.clear();
492 #if !HAVE_FEATURE_DBCONNECTIVITY
498 for (
const auto& pParam : rArr)
500 rAllDBNames.emplace_back(pParam->sDataSource + OUStringChar(
DB_DELIM) + pParam->sCommand);
506 const OUString& rFormula,
507 std::vector<OUString>& rUsedDBNames )
511 const OUString sFormula(rCC.
uppercase( rFormula ));
513 const OUString sFormula(rFormula);
516 for (
const auto &sItem : rAllDBNames)
518 sal_Int32
nPos = sFormula.indexOf( sItem );
520 sFormula[ nPos + sItem.getLength() ] ==
'.' &&
524 nPos += sItem.getLength() + 1;
525 const sal_Int32 nEndPos = sFormula.indexOf(
'.', nPos);
528 rUsedDBNames.emplace_back(sItem + OUStringChar(
DB_DELIM) + sFormula.subView( nPos, nEndPos - nPos ));
536 const std::vector<OUString>& rUsedDBNames )
538 for (
const auto &
sName : rUsedDBNames )
544 #if !HAVE_FEATURE_DBCONNECTIVITY
548 if( rDBName.isEmpty() )
552 for(
const auto &
sName : rDBNameList )
553 if( rDBName ==
sName.getToken(0,
';') )
557 for(
const auto &
sName : rDBNameList )
558 if( rSCmp.isEqual( rDBName,
sName.getToken(0,
';') ) )
568 rDBNameList.push_back(rDBName);
573 const OUString& rNewName )
575 #if !HAVE_FEATURE_DBCONNECTIVITY
586 for (
auto n = rArr.
size();
n; )
606 bool bExpand =
false;
611 #if HAVE_FEATURE_DBCONNECTIVITY
622 static_cast<SwDBField*
>(pField)->ClearInitialized();
623 static_cast<SwDBField*
>(pField)->InitContent();
633 lcl_DBDataToString(static_cast<SwDBNameInfField*>(pField)->GetRealDBData())))
643 lcl_DBDataToString(static_cast<SwDBNameInfField*>(pField)->GetRealDBData())))
674 OUString lcl_CutOffDBCommandType(
const OUString& rName)
676 return rName.replaceFirst(OUStringChar(
DB_DELIM),
".").getToken(0,
DB_DELIM);
682 const OUString& rNewName,
const OUString& rFormula )
685 const OUString sNewName( lcl_CutOffDBCommandType(rNewName) );
686 OUString sFormula(rFormula);
688 for(
const auto & rUsedDBName : rUsedDBNames)
690 const OUString sDBName( lcl_CutOffDBCommandType(rUsedDBName) );
692 if (sDBName!=sNewName)
697 nPos = sFormula.indexOf(sDBName, nPos);
703 if( sFormula[nPos + sDBName.getLength()] ==
'.' &&
706 sFormula = sFormula.replaceAt(nPos, sDBName.getLength(), sNewName);
710 nPos += sNewName.getLength();
721 for(
const auto &
sName : rArr )
726 for(
const auto &
sName : rArr )
727 if( rSCmp.isEqual( rName,
sName ))
827 std::vector<sal_uLong> aTmpArr;
828 std::vector<sal_uLong>::size_type nArrStt = 0;
842 aTmpArr.push_back( nIdx );
843 if( nIdx < nSttContent )
847 std::sort(aTmpArr.begin(), aTmpArr.end());
851 for (std::vector<sal_uLong>::size_type
n = nArrStt;
n < aTmpArr.size(); ++
n)
853 pSectNd = rDoc.
GetNodes()[ aTmpArr[
n ] ]->GetSectionNode();
854 OSL_ENSURE( pSectNd,
"Where is my SectionNode" );
857 for (std::vector<sal_uLong>::size_type
n = 0;
n < nArrStt; ++
n)
859 pSectNd = rDoc.
GetNodes()[ aTmpArr[
n ] ]->GetSectionNode();
860 OSL_ENSURE( pSectNd,
"Where is my SectionNode" );
865 for (
const auto &
nId : aTmpArr)
871 const OUString sTrue(
"TRUE");
872 const OUString sFalse(
"FALSE");
874 #if HAVE_FEATURE_DBCONNECTIVITY
915 if (sFormula.isEmpty() || sFormula==sFalse)
916 const_cast<SwHiddenParaField*>(static_cast<const SwHiddenParaField*>(pField))->SetHidden(
false );
917 else if (sFormula==sTrue)
924 const_cast<SwFormatField*
>(pFormatField)->UpdateTextNode(
nullptr,
nullptr );
932 if (sFormula.isEmpty() || sFormula==sFalse)
933 const_cast<SwHiddenTextField*>(static_cast<const SwHiddenTextField*>(pField))->
SetValue(
true );
934 else if (sFormula==sTrue)
944 const_cast<SwFormatField*
>(pFormatField)->UpdateTextNode(
nullptr,
nullptr);
948 #if HAVE_FEATURE_DBCONNECTIVITY
951 SwDBData aDBData(const_cast<SwDBNumSetField*>(static_cast<const SwDBNumSetField*>(pField))->GetDBData(&rDoc));
956 && static_cast<const SwDBNumSetField*>(pField)->IsCondValid()))
965 SwDBData aDBData(const_cast<SwDBNextSetField*>(static_cast<const SwDBNextSetField*>(pField))->GetDBData(&rDoc));
970 && static_cast<const SwDBNextSetField*>(pField)->IsCondValid()))
981 if (!sFormula.isEmpty())
998 std::pair<Point, bool>
const tmp(aPt,
false);
1002 std::unique_ptr<SetGetExpField> pNew;
1003 bool bIsInBody =
false;
1015 if( (pFrame !=
nullptr) || bIsInBody )
1023 OSL_ENSURE(bResult,
"where is the Field");
1024 pNew.reset(
new SetGetExpField( aPos.nNode, &rTField, &aPos.nContent ));
1033 #if HAVE_FEATURE_DBCONNECTIVITY
1040 if( pNew !=
nullptr )
1047 std::unique_ptr<SetGetExpField> pNew;
1063 std::pair<Point, bool>
const tmp(aPt,
false);
1071 OSL_ENSURE(bResult,
"where is the Field");
1085 OUString sFieldName;
1086 switch( rType.
Which() )
1095 OSL_ENSURE(
false,
"No valid field type" );
1098 if( sFieldName.isEmpty() )
1118 OUString sFieldName;
1119 switch( rType.
Which() )
1130 if( sFieldName.isEmpty() )
1149 while( pPrev->
pNext.get() != pFnd )
1150 pPrev = pPrev->
pNext.get();
1157 : m_FieldTypeTable(
TBLSZ)
1159 , m_nFieldListGetMode(0)
1161 , m_bInUpdateFields(false)
1162 , m_bFieldsDirty(false)
Instances of SwFields and those derived from it occur 0 to n times.
void SetValue(bool bHidden)
Represents the visualization of a paragraph.
const ::utl::TransliterationWrapper & GetAppCmpStrIgnore()
sal_uLong GetIndex() const
bool IsUsed(const sw::BroadcastingModify &) const
The shared part of a user field.
Marks a position in the document model.
static std::vector< OUString > & FindUsedDBs(const std::vector< OUString > &rAllDBNames, const OUString &rFormula, std::vector< OUString > &rUsedDBNames)
SetGetExpField(const SwNodeIndex &rNdIdx, const SwTextField *pField=nullptr, const SwIndex *pIdx=nullptr)
virtual const SwRootFrame * GetCurrentLayout() const =0
static const SwDBData & GetAddressDBName()
static OUString ReplaceUsedDBs(const std::vector< OUString > &rUsedDBNames, const OUString &rNewName, const OUString &rFormula)
SwDoc & GetDoc()
Which Doc contains the nodes-array?
const SwTextNode * GetBodyTextNode(const SwDoc &rDoc, SwPosition &rPos, const SwFrame &rFrame)
Forward declaration: get "BodyTextNode" for exp.fld in Fly's headers/footers/footnotes.
void GetAllDBNames(std::vector< OUString > &rAllDBNames)
bool OpenDataSource(const OUString &rDataSource, const OUString &rTableOrQuery)
open the source while fields are updated - for the calculator only!
virtual void SetModified()=0
Must be called manually at changes of format.
const OUString & GetColumnName() const
Base class of all fields.
SwContentFrame * getLayoutFrame(const SwRootFrame *, const SwPosition *pPos=nullptr, std::pair< Point, bool > const *pViewPosAndCalcFrame=nullptr) const
SwDocUpdateField(SwDoc &rDocument)
Content, content of frame (header, footer, fly).
SwSectionFormat * GetFormat()
std::unique_ptr< SwHash > pNext
SwNode & GetEndOfPostIts() const
A still empty section.
OUString LookString(SwHashTable< HashStr > const &rTable, const OUString &rName)
Look up the Name, if it is present, return its String, otherwise return an empty String.
For old documents the Field-Which IDs must be preserved !!!
OUString const & GetCondition() const
void GatherFields(std::vector< SwFormatField * > &rvFormatFields, bool bCollectOnlyInDocNodes=true) const
const SwNode * GetNodeFromContent() const
const SwSection & GetSection() const
virtual OUString GetPar1() const
IDocumentFieldsAccess const & getIDocumentFieldsAccess() const
bool isLetterNumeric(const OUString &rStr, sal_Int32 nPos) const
virtual void SetPar2(const OUString &rStr)
sal_uLong GetIndex() const
sal_Int32 GetStart() const
void SetInitDBFields(bool b)
const SwFormatField & GetFormatField() const
const SwDBData & GetDBDesc()
void SetBodyPos(const SwContentFrame &rFrame)
void ExpandTextField(const bool bForceNotify=false) const
constexpr OUStringLiteral aData
virtual SwFieldType * ChgTyp(SwFieldType *)
Set new type (used for copying among documents).
virtual void SetPar1(const OUString &rStr)
constexpr TypedWhichId< SwFormatField > RES_TXTATR_FIELD(RES_TXTATR_NOEND_BEGIN)
void GetBodyNode(const SwTextField &, SwFieldIds nFieldWhich)
void RemoveFieldType(const SwFieldType &rType)
std::unique_ptr< SetGetExpFields > m_pFieldSortList
current field list for calculation
SwDBData const & GetDBData()
const SwStartNode * StartOfSectionNode() const
std::vector< SwSectionFormat * >::size_type size_type
void SetCondHidden(bool const bFlag)
void ChgBodyTextFlag(bool bIsInBody)
Set by UpdateExpFields where node position is known.
SwIndex & Assign(SwIndexReg *, sal_Int32)
void Evaluate(SwDoc &rDoc)
get current field value and cache it
void GetAllUsedDB(std::vector< OUString > &rDBNameList, const std::vector< OUString > *pAllDBNames=nullptr)
SwContentNode * GetContentNode()
OUString uppercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
Marks a character position inside a document model node.
sal_Int32 GetCntPosFromContent() const
IDocumentState const & getIDocumentState() const
Marks a node in the document model.
SwNodes & GetNodes()
Node is in which nodes-array/doc?
T * Find(const OUString &rStr, sal_uInt16 *pPos=nullptr) const
virtual const SwFieldTypes * GetFieldTypes() const =0
sal_uLong GetNode() const
OUString lowercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
virtual sal_uInt16 GetSubType() const
IDocumentLayoutAccess const & getIDocumentLayoutAccess() const
SwFieldType * GetTyp() const
sal_uLong m_nNodes
to check if the node count changed
bool operator<(const SetGetExpField &rField) const
const SwNodeIndex * GetContentIdx() const
SwTextNode is a paragraph in the document model.
SwHashTable< SwCalcFieldType > const & GetFieldTypeTable() const
void MakeFieldList_(SwDoc &pDoc, int eGetMode)
std::vector< std::unique_ptr< SwDSParam > > SwDSParams_t
const SwStartNode * GetSttNd() const
bool ChangeEntryContent(const SwAuthEntry *pNewEntry)
void SetFieldsDirty(bool b)
virtual SwFieldType * InsertFieldType(const SwFieldType &)=0
enum SetGetExpField::SetGetExpFieldType m_eSetGetExpFieldType
void ChangeDBFields(const std::vector< OUString > &rOldNames, const OUString &rNewName)
sal_Int32 GetIndex() const
void SetInitDBFields(bool b)
OString strip(const OString &rIn, char c)
Item2Range GetItemSurrogates(sal_uInt16 nWhich) const
SwTableBox is one table cell in the document model.
static bool IsNameInArray(const std::vector< OUString > &rOldNames, const OUString &rName)
HashStr(const OUString &rName, const OUString &rText, HashStr *)
constexpr TypedWhichId< SwFormatField > RES_TXTATR_INPUTFIELD(55)
SwTableNode * FindTableNode()
Search table node, in which it is.
const SwStartNode * FindFlyStartNode() const
void AddUsedDBToList(std::vector< OUString > &rDBNameList, const std::vector< OUString > &rUsedDBNames)
bool IsDocNodes() const
Is the NodesArray the regular one of Doc? (and not the UndoNds, ...) Implementation in doc...
const SwGetSetExpType GSE_STRING
String.
bool IsFrameBehind(const SwTextNode &rMyNd, sal_Int32 nMySttPos, const SwTextNode &rBehindNd, sal_Int32 nSttPos)
void GetPosOfContent(SwPosition &rPos) const
const SwTextField * pTextField
void MakeFieldList(SwDoc &rDoc, bool bAll, int eGetMode)
void InsertFieldType(const SwFieldType &rType)
SwTextNode & GetTextNode() const
virtual OUString GetFormula() const
std::vector< std::unique_ptr< SetGetExpField > >::size_type size_type
void ChgBodyTextFlag(bool bIsInBody)
set from UpdateExpFields (the Node-Position is known there)
SwNode & GetEndOfExtras() const
This is the last EndNode of a special section.
void ChangeAuthorityData(const SwAuthEntry *pNewData)
bool operator==(const SetGetExpField &rField) const
const SwDSParams_t & GetDSParamArray() const
SwSectionFormats & GetSections()
CharClass & GetAppCharClass()
void SetHidden(bool bHidden)
void CreateDSData(const SwDBData &rData)
SwContentNode * GoNext(SwNodeIndex *) const
SwHashTable< SwCalcFieldType > m_FieldTypeTable
T should be a subclass of SwHash.
SwDBManager * GetDBManager() const
const SwAttrPool & GetAttrPool() const
SwTextNode * GetTextNode()
Inline methods from Node.hxx.
void SetCondition(OUString const &rNew)
union SetGetExpField::@4 m_CNTNT
void InsDelFieldInFieldLst(bool bIns, const SwTextField &rField)
Base class of the Writer document model elements.