LibreOffice Module sw (master)  1
edfld.cxx
Go to the documentation of this file.
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
3  * This file is part of the LibreOffice project.
4  *
5  * This Source Code Form is subject to the terms of the Mozilla Public
6  * License, v. 2.0. If a copy of the MPL was not distributed with this
7  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8  *
9  * This file incorporates work covered by the following license notice:
10  *
11  * Licensed to the Apache Software Foundation (ASF) under one or more
12  * contributor license agreements. See the NOTICE file distributed
13  * with this work for additional information regarding copyright
14  * ownership. The ASF licenses this file to you under the Apache
15  * License, Version 2.0 (the "License"); you may not use this file
16  * except in compliance with the License. You may obtain a copy of
17  * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18  */
19 
20 #include <config_features.h>
21 
22 #include <osl/diagnose.h>
23 #include <unotools/charclass.hxx>
24 #include <editsh.hxx>
25 #include <fldbas.hxx>
26 #include <doc.hxx>
28 #include <IDocumentState.hxx>
29 #include <docary.hxx>
30 #include <fmtfld.hxx>
31 #include <txtfld.hxx>
32 #include <pamtyp.hxx>
33 #include <expfld.hxx>
34 #include <swundo.hxx>
35 #include <dbmgr.hxx>
36 #include <hints.hxx>
37 #include <calbck.hxx>
38 #include <fieldhint.hxx>
41 
44 {
45  const SwFieldTypes* pFieldTypes = GetDoc()->getIDocumentFieldsAccess().GetFieldTypes();
46 
47  if(nResId == SwFieldIds::Unknown)
48  {
49  return static_cast<sal_uInt16>(pFieldTypes->size());
50  }
51 
52  // all types with the same ResId
53  size_t nIdx = 0;
54  for(const auto & pFieldType : *pFieldTypes)
55  {
56  // same ResId -> increment index
57  if(pFieldType->Which() == nResId)
58  nIdx++;
59  }
60  return nIdx;
61 }
62 
64 SwFieldType* SwEditShell::GetFieldType(size_t nField, SwFieldIds nResId ) const
65 {
66  const SwFieldTypes* pFieldTypes = GetDoc()->getIDocumentFieldsAccess().GetFieldTypes();
67 
68  if(nResId == SwFieldIds::Unknown && nField < pFieldTypes->size())
69  {
70  return (*pFieldTypes)[nField].get();
71  }
72 
73  size_t nIdx = 0;
74  for(const auto & pFieldType : *pFieldTypes)
75  {
76  // same ResId -> increment index
77  if(pFieldType->Which() == nResId)
78  {
79  if(nIdx == nField)
80  return pFieldType.get();
81  nIdx++;
82  }
83  }
84  return nullptr;
85 }
86 
88 SwFieldType* SwEditShell::GetFieldType(SwFieldIds nResId, const OUString& rName) const
89 {
90  return GetDoc()->getIDocumentFieldsAccess().GetFieldType( nResId, rName, false );
91 }
92 
94 void SwEditShell::RemoveFieldType(size_t nField)
95 {
97 }
98 
100 void SwEditShell::RemoveFieldType(SwFieldIds nResId, const OUString& rStr)
101 {
102  const SwFieldTypes* pFieldTypes = GetDoc()->getIDocumentFieldsAccess().GetFieldTypes();
103  const SwFieldTypes::size_type nSize = pFieldTypes->size();
104  const CharClass& rCC = GetAppCharClass();
105 
106  OUString aTmp( rCC.lowercase( rStr ));
107 
108  for(SwFieldTypes::size_type i = 0; i < nSize; ++i)
109  {
110  // same ResId -> increment index
111  SwFieldType* pFieldType = (*pFieldTypes)[i].get();
112  if( pFieldType->Which() == nResId )
113  {
114  if( aTmp == rCC.lowercase( pFieldType->GetName() ) )
115  {
117  return;
118  }
119  }
120  }
121 }
122 
124 {
125  if( !pType->HasWriterListeners() )
126  return;
127 
128  SET_CURR_SHELL( this );
129  StartAllAction();
131  Push();
132  SwPaM* pPaM = GetCursor();
133  // TODO: this is really hackish
134  SwFieldHint aHint(pPaM, GetLayout());
135  SwIterator<SwClient,SwFieldType> aIter(*pType);
136  for( SwClient* pClient = aIter.First(); pClient; pClient = aIter.Next() )
137  {
138  pPaM->DeleteMark();
139  pClient->SwClientNotifyCall( *pType, aHint );
140  }
141 
143  EndAllAction();
145 }
146 
148 void SwEditShell::Insert2(SwField const & rField, const bool bForceExpandHints)
149 {
150  SET_CURR_SHELL( this );
151  StartAllAction();
152  SwFormatField aField( rField );
153 
154  const SetAttrMode nInsertFlags = bForceExpandHints
157 
158  for(const SwPaM& rPaM : GetCursor()->GetRingContainer()) // for each PaM
159  {
160  const bool bSuccess(GetDoc()->getIDocumentContentOperations().InsertPoolItem(rPaM, aField, nInsertFlags));
161  OSL_ENSURE( bSuccess, "Doc->Insert(Field) failed");
162  }
163 
164  EndAllAction();
165 }
166 
168 static SwTextField* lcl_FindInputField( SwDoc* pDoc, SwField& rField )
169 {
170  // Search field via its address. For input fields this needs to be done in protected fields.
171  SwTextField* pTField = nullptr;
172  if (SwFieldIds::Input == rField.Which()
173  || (SwFieldIds::SetExp == rField.Which()
174  && static_cast<SwSetExpField&>(rField).GetInputFlag()
175  && (static_cast<SwSetExpFieldType*>(rField.GetTyp())->GetType()
177  {
178  for (const SfxPoolItem* pItem : pDoc->GetAttrPool().GetItemSurrogates(RES_TXTATR_INPUTFIELD))
179  {
180  auto pFormatField = dynamic_cast<const SwFormatField*>(pItem);
181  if( pFormatField && pFormatField->GetField() == &rField )
182  {
183  pTField = const_cast<SwFormatField*>(pFormatField)->GetTextField();
184  break;
185  }
186  }
187  }
188  else if( SwFieldIds::SetExp == rField.Which()
189  && static_cast<SwSetExpField&>(rField).GetInputFlag() )
190  {
191  for (const SfxPoolItem* pItem : pDoc->GetAttrPool().GetItemSurrogates(RES_TXTATR_FIELD))
192  {
193  auto pFormatField = dynamic_cast<const SwFormatField*>(pItem);
194  if( pFormatField && pFormatField->GetField() == &rField )
195  {
196  pTField = const_cast<SwFormatField*>(pFormatField)->GetTextField();
197  break;
198  }
199  }
200  }
201  return pTField;
202 }
203 
205 {
206  SET_CURR_SHELL( this );
207  StartAllAction();
208  {
209  // If there are no selections so take the value of the current cursor position.
210  SwMsgPoolItem* pMsgHint = nullptr;
211  SwRefMarkFieldUpdate aRefMkHt( GetOut() );
212  SwFieldIds nFieldWhich = rField.GetTyp()->Which();
213  if( SwFieldIds::GetRef == nFieldWhich )
214  pMsgHint = &aRefMkHt;
215 
216  SwPaM* pCursor = GetCursor();
217  SwTextField *pTextField;
218  SwFormatField *pFormatField;
219 
220  if ( !pCursor->IsMultiSelection() && !pCursor->HasMark())
221  {
222  pTextField = GetTextFieldAtPos( pCursor->Start(), true );
223 
224  if (!pTextField) // #i30221#
225  pTextField = lcl_FindInputField( GetDoc(), rField);
226 
227  if (pTextField != nullptr)
228  GetDoc()->getIDocumentFieldsAccess().UpdateField(pTextField, rField, pMsgHint, true);
229  }
230 
231  // bOkay (instead of return because of EndAllAction) becomes false,
232  // 1) if only one PaM has more than one field or
233  // 2) if there are mixed field types
234  bool bOkay = true;
235  bool bTableSelBreak = false;
236 
237  SwMsgPoolItem aFieldHint( RES_TXTATR_FIELD ); // Search-Hint
238  SwMsgPoolItem aAnnotationFieldHint( RES_TXTATR_ANNOTATION );
239  SwMsgPoolItem aInputFieldHint( RES_TXTATR_INPUTFIELD );
240  for(SwPaM& rPaM : GetCursor()->GetRingContainer()) // for each PaM
241  {
242  if( rPaM.HasMark() && bOkay ) // ... with selection
243  {
244  // copy of the PaM
245  SwPaM aCurPam( *rPaM.GetMark(), *rPaM.GetPoint() );
246  SwPaM aPam( *rPaM.GetPoint() );
247 
248  SwPosition *pCurStt = aCurPam.Start(), *pCurEnd =
249  aCurPam.End();
250  /*
251  * In case that there are two contiguous fields in a PaM, the aPam goes step by step
252  * to the end. aCurPam is reduced in each loop. If aCurPam was searched completely,
253  * the loop terminates because Start = End.
254  */
255 
256  // Search for SwTextField ...
257  while( bOkay
258  && pCurStt->nContent != pCurEnd->nContent
259  && (sw::FindAttrImpl(aPam, aFieldHint, fnMoveForward, aCurPam, true, GetLayout())
260  || sw::FindAttrImpl(aPam, aAnnotationFieldHint, fnMoveForward, aCurPam, false, GetLayout())
261  || sw::FindAttrImpl(aPam, aInputFieldHint, fnMoveForward, aCurPam, false, GetLayout())))
262  {
263  // if only one PaM has more than one field ...
264  if( aPam.Start()->nContent != pCurStt->nContent )
265  bOkay = false;
266 
267  if( nullptr != (pTextField = GetTextFieldAtPos( pCurStt, true )) )
268  {
269  pFormatField = const_cast<SwFormatField*>(&pTextField->GetFormatField());
270  SwField *pCurField = pFormatField->GetField();
271 
272  // if there are mixed field types
273  if( pCurField->GetTyp()->Which() !=
274  rField.GetTyp()->Which() )
275  bOkay = false;
276 
277  bTableSelBreak = GetDoc()->getIDocumentFieldsAccess().UpdateField(pTextField, rField,
278  pMsgHint, false);
279  }
280  // The search area is reduced by the found area:
281  ++pCurStt->nContent;
282  }
283  }
284 
285  if( bTableSelBreak ) // If table section and table formula are updated -> finish
286  break;
287 
288  }
289  }
291  EndAllAction();
292 }
293 
295 {
296  return GetDoc()->GetDBData();
297 }
298 
300 {
301  return GetDoc()->GetDBDesc();
302 }
303 
304 void SwEditShell::ChgDBData(const SwDBData& rNewData)
305 {
306  GetDoc()->ChgDBData(rNewData);
307 }
308 
309 void SwEditShell::GetAllUsedDB( std::vector<OUString>& rDBNameList,
310  std::vector<OUString> const * pAllDBNames )
311 {
312  GetDoc()->GetAllUsedDB( rDBNameList, pAllDBNames );
313 }
314 
315 void SwEditShell::ChangeDBFields( const std::vector<OUString>& rOldNames,
316  const OUString& rNewName )
317 {
318  GetDoc()->ChangeDBFields( rOldNames, rNewName );
319 }
320 
322 void SwEditShell::UpdateExpFields(bool bCloseDB)
323 {
324  SET_CURR_SHELL( this );
325  StartAllAction();
326  GetDoc()->getIDocumentFieldsAccess().UpdateExpFields(nullptr, true);
327  if (bCloseDB)
328  {
329 #if HAVE_FEATURE_DBCONNECTIVITY
330  GetDoc()->GetDBManager()->CloseAll(); // close all database connections
331 #endif
332  }
333  EndAllAction();
334 }
335 
337 {
338 #if HAVE_FEATURE_DBCONNECTIVITY
339  return GetDoc()->GetDBManager();
340 #else
341  return NULL;
342 #endif
343 }
344 
347 {
348  return GetDoc()->getIDocumentFieldsAccess().InsertFieldType(rFieldType);
349 }
350 
352 {
354 }
355 
357 {
359 }
360 
362 {
364 }
365 
367 {
369 }
370 
372 {
374 }
375 
376 void SwEditShell::SetLabelDoc( bool bFlag )
377 {
379 }
380 
382 {
384 }
385 
387 {
388  GetDoc()->ChangeAuthorityData(pNewData);
389 }
390 
392 {
393  const SwFieldTypes * pFieldTypes = GetDoc()->getIDocumentFieldsAccess().GetFieldTypes();
394  for(const auto & pFieldType : *pFieldTypes)
395  {
396  if(IsUsed(*pFieldType))
397  {
398  switch(pFieldType->Which())
399  {
404  {
405  SwIterator<SwFormatField,SwFieldType> aIter( *pFieldType );
406  SwFormatField* pField = aIter.First();
407  while(pField)
408  {
409  if(pField->IsFieldInDoc())
410  return true;
411  pField = aIter.Next();
412  }
413  }
414  break;
415  default: break;
416  }
417  }
418  }
419  return false;
420 }
421 
422 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
SwFieldType * GetFieldType(size_t nField, SwFieldIds nResId=SwFieldIds::Unknown) const
get field types with a ResId, if 0 get all
Definition: edfld.cxx:64
SwRefMarkFieldUpdate is sent when the referencemarks should be updated.
Definition: hints.hxx:169
vcl::RenderContext * GetOut() const
Definition: viewsh.hxx:341
Instances of SwFields and those derived from it occur 0 to n times.
Definition: fldbas.hxx:234
void DeleteMark()
Definition: pam.hxx:177
void ChgDBData(const SwDBData &SwDBData)
Definition: edfld.cxx:304
void ChgDBData(const SwDBData &rNewData)
Definition: doc.cxx:452
Marks a position in the document model.
Definition: pam.hxx:35
const SwField * GetField() const
Definition: fmtfld.hxx:70
bool IsMultiSelection() const
Definition: pam.hxx:272
SwPaM * GetCursor(bool bMakeTableCursor=true) const
Return pointer to the current shell cursor.
Definition: crsrsh.cxx:184
SwFieldUpdateFlags
Definition: fldupde.hxx:22
virtual SwFieldType * GetFieldType(SwFieldIds nResId, const OUString &rName, bool bDbFieldMatching) const =0
virtual void SetModified()=0
Must be called manually at changes of format.
Base class of all fields.
Definition: fldbas.hxx:280
Definition: doc.hxx:185
TElementType * Next()
Definition: calbck.hxx:373
virtual void set(DocumentSettingId id, bool value) override
Set the specified document setting.
virtual void setFieldUpdateFlags(SwFieldUpdateFlags nMode)=0
Set the current field update mode.
SwUndoId EndUndo(SwUndoId eUndoId=SwUndoId::EMPTY, const SwRewriter *pRewriter=nullptr)
Closes parenthesis of nUndoId, not used by UI.
Definition: edws.cxx:233
const IDocumentSettingAccess & getIDocumentSettingAccess() const
Provides access to the document setting interface.
Definition: viewsh.cxx:2591
static SwTextField * lcl_FindInputField(SwDoc *pDoc, SwField &rField)
Are the PaMs positioned on fields?
Definition: edfld.cxx:168
void SetLabelDoc(bool bFlag)
Labels: Synchronize ranges.
Definition: edfld.cxx:376
bool HasWriterListeners() const
Definition: calbck.hxx:208
void EndAllAction()
Definition: edws.cxx:96
For old documents the Field-Which IDs must be preserved !!!
virtual bool UpdateField(SwTextField *rDstFormatField, SwField &rSrcField, SwMsgPoolItem *pMsgHint, bool bUpdateTableFields)=0
Updates a field.
void ChangeAuthorityData(const SwAuthEntry *pNewData)
Definition: edfld.cxx:386
SwFieldUpdateFlags GetFieldUpdateFlags() const
Definition: edfld.cxx:371
virtual void LockExpFields()=0
virtual void UpdateExpFields(SwTextField *pField, bool bUpdateRefFields)=0
IDocumentContentOperations & getIDocumentContentOperations()
Provides access to the content operations interface.
Definition: viewsh.cxx:2603
IDocumentFieldsAccess const & getIDocumentFieldsAccess() const
Definition: doc.cxx:356
return NULL
virtual bool IsExpFieldsLocked() const =0
SwDoc * GetDoc() const
Definition: viewsh.hxx:284
const SwFormatField & GetFormatField() const
Definition: txatbase.hxx:191
bool IsLabelDoc() const
Definition: edfld.cxx:381
virtual SwFieldUpdateFlags getFieldUpdateFlags(bool bGlobalSettings) const =0
Get the current field update mode.
const SwDBData & GetDBDesc()
Definition: docfld.cxx:347
bool FindAttrImpl(SwPaM &rSearchPam, const SfxPoolItem &rAttr, SwMoveFnCollection const &fnMove, const SwPaM &rRegion, bool bInReadOnly, SwRootFrame const *const pLayout)
Definition: findattr.cxx:885
SwDBManager * GetDBManager() const
For evaluation of DB fields (new DB-manager).
Definition: edfld.cxx:336
PaM is Point and Mark: a selection of the document model.
Definition: pam.hxx:136
void GetAllUsedDB(std::vector< OUString > &rDBNameList, std::vector< OUString > const *pAllDBNames)
Definition: edfld.cxx:309
SwDBData const & GetDBData()
Definition: docfld.cxx:342
void Insert2(const OUString &, const bool bForceExpandHints=false)
Definition: editsh.cxx:79
SwFieldType * InsertFieldType(const SwFieldType &)
insert field type
Definition: edfld.cxx:346
void Push()
store a copy of the current cursor on the cursor stack
Definition: crsrsh.cxx:2221
SetAttrMode
Definition: swtypes.hxx:143
TElementType * First()
Definition: calbck.hxx:342
int i
void GetAllUsedDB(std::vector< OUString > &rDBNameList, const std::vector< OUString > *pAllDBNames=nullptr)
Definition: docfld.cxx:412
SwFieldIds
Definition: fldbas.hxx:38
bool HasMark() const
A PaM marks a selection if Point and Mark are distinct positions.
Definition: pam.hxx:205
size_t GetFieldTypeCount(SwFieldIds nResId=SwFieldIds::Unknown) const
count field types with a ResId, if SwFieldIds::Unknown count all
Definition: edfld.cxx:43
SwUndoId StartUndo(SwUndoId eUndoId=SwUndoId::EMPTY, const SwRewriter *pRewriter=nullptr)
Undo: set up Undo parenthesis, return nUndoId of this parenthesis.
Definition: edws.cxx:222
Force hint expand (only matters for hints with CH_TXTATR).
bool IsUsed(const SwModify &) const
Query if the paragraph-/character-/frame-/page-style is used.
Definition: edfmt.cxx:139
void CloseAll(bool bIncludingMerge=true)
close all data sources - after fields were updated
Definition: dbmgr.cxx:2459
SwDBData const & GetDBData() const
Database information.
Definition: edfld.cxx:294
const SwDBData & GetDBDesc() const
Definition: edfld.cxx:299
IDocumentState const & getIDocumentState() const
Definition: doc.cxx:393
size
#define SET_CURR_SHELL(shell)
Definition: swtypes.hxx:101
virtual const SwFieldTypes * GetFieldTypes() const =0
ring_container GetRingContainer()
OUString lowercase(const OUString &rStr, sal_Int32 nPos, sal_Int32 nCount) const
void UpdateOneField(SwField &)
One single field.
Definition: edfld.cxx:204
void UnlockExpFields()
Definition: edfld.cxx:356
const SwPosition * Start() const
Definition: pam.hxx:212
SwFieldType * GetTyp() const
Definition: fldbas.hxx:383
bool IsFieldInDoc() const
Definition: atrfld.cxx:329
void FieldToText(SwFieldType const *pType)
Definition: edfld.cxx:123
void UpdateExpFields(bool bCloseDB=false)
only every expression fields update
Definition: edfld.cxx:322
bool IsAnyDatabaseFieldInDoc() const
Definition: edfld.cxx:391
#define RES_TXTATR_FIELD
Definition: hintids.hxx:151
SwFieldIds Which() const
ResId.
Definition: fldbas.cxx:192
virtual OUString GetName() const
Only in derived classes.
Definition: fldbas.cxx:135
virtual SwFieldType * InsertFieldType(const SwFieldType &)=0
SwMoveFnCollection const & fnMoveForward
SwPam::Move()/Find() default argument.
Definition: paminit.cxx:59
#define RES_TXTATR_ANNOTATION
Definition: hintids.hxx:154
void ChangeDBFields(const std::vector< OUString > &rOldNames, const OUString &rNewName)
Definition: docfld.cxx:573
void RemoveFieldType(size_t nField)
delete field type
Definition: edfld.cxx:94
Item2Range GetItemSurrogates(sal_uInt16 nWhich) const
::sw::DocumentSettingManager & GetDocumentSettingManager()
Definition: doc.cxx:185
void SetFieldUpdateFlags(SwFieldUpdateFlags eFlags)
Definition: edfld.cxx:366
virtual bool get(DocumentSettingId id) const =0
Return the specified document setting.
const SwGetSetExpType GSE_STRING
String.
Definition: fldbas.hxx:196
bool Pop(PopMode)
delete cursor
Definition: crsrsh.cxx:2243
virtual void UnlockExpFields()=0
void ChangeDBFields(const std::vector< OUString > &rOldNames, const OUString &rNewName)
Definition: edfld.cxx:315
void ChangeAuthorityData(const SwAuthEntry *pNewData)
Definition: docfld.cxx:734
void StartAllAction()
For all views of this document.
Definition: edws.cxx:85
bool IsExpFieldsLocked() const
Definition: edfld.cxx:361
SwRootFrame * GetLayout() const
Definition: viewsh.cxx:2075
CharClass & GetAppCharClass()
Definition: init.cxx:709
#define RES_TXTATR_INPUTFIELD
Definition: hintids.hxx:146
SwFieldIds Which() const
Definition: fldbas.hxx:266
SwDBManager * GetDBManager() const
Definition: doc.hxx:663
void LockExpFields()
Definition: edfld.cxx:351
virtual void RemoveFieldType(size_t nField)=0
const SwAttrPool & GetAttrPool() const
Definition: doc.hxx:1309
static SwTextField * GetTextFieldAtPos(const SwPosition *pPos, const bool bIncludeInputFieldAtStart)
Definition: crstrvl.cxx:879