21 #include <com/sun/star/beans/XPropertySet.hpp>
22 #include <com/sun/star/frame/XModel.hpp>
23 #include <com/sun/star/text/XTextFieldsSupplier.hpp>
24 #include <com/sun/star/text/FilenameDisplayFormat.hpp>
25 #include <com/sun/star/util/XRefreshable.hpp>
26 #include <com/sun/star/util/XUpdatable.hpp>
27 #include <ooo/vba/word/WdFieldType.hpp>
36 SwVbaField::SwVbaField(
const uno::Reference< ooo::vba::XHelperInterface >& rParent,
const uno::Reference< uno::XComponentContext >& rContext,
const uno::Reference< css::text::XTextField >& xTextField) :
SwVbaField_BASE( rParent, rContext )
43 uno::Reference< util::XUpdatable > xUpdatable(
mxTextField, uno::UNO_QUERY );
59 uno::Sequence<OUString>
73 class SwVbaReadFieldParams
77 sal_Int32 nLen, nFnd, nNext, nSavPtr;
80 explicit SwVbaReadFieldParams(
const OUString& rData );
84 sal_Int32 FindNextStringPiece( sal_Int32 _nStart );
86 OUString GetResult()
const;
87 const OUString& GetFieldName()
const {
return aFieldName; }
92 SwVbaReadFieldParams::SwVbaReadFieldParams(
const OUString& _rData )
98 while( (nLen > nNext) && (
aData[ nNext ] ==
' ') )
103 && (c =
aData[ nNext ]) !=
' '
112 aFieldName =
aData.copy( 0, nFnd );
115 OUString SwVbaReadFieldParams::GetResult()
const
123 tools::Long SwVbaReadFieldParams::SkipToNextToken()
127 (-1 != nNext) && (nLen > nNext) &&
128 -1 != (nFnd = FindNextStringPiece(nNext))
133 if (
'\\' ==
aData[nFnd] &&
'\\' !=
aData[nFnd + 1])
135 nRet =
aData[++nFnd];
144 (
'"' ==
aData[nSavPtr - 1]) ||
145 (0x201d ==
aData[nSavPtr - 1])
164 sal_Int32 SwVbaReadFieldParams::FindNextStringPiece(
const sal_Int32 nStart)
166 sal_Int32
n = ( -1 == nStart ) ? nFnd : nStart;
171 while( (nLen > n) && (
aData[ n ] ==
' ') )
177 if( (
aData[ n ] ==
'"')
178 || (
aData[ n ] == 0x201c)
179 || (
aData[ n ] == 132) )
184 && (
aData[ n2 ] !=
'"')
185 && (
aData[ n2 ] != 0x201d)
186 && (
aData[ n2 ] != 147) )
192 while( (nLen > n2) && (
aData[ n2 ] !=
' ') )
194 if(
aData[ n2 ] ==
'\\' )
196 if(
aData[ n2+1 ] ==
'\\' )
211 if(
aData[ n2 ] !=
' ') n2++;
219 static uno::Any lcl_createField(
const uno::Reference< XHelperInterface >& xParent,
const uno::Reference< uno::XComponentContext >& xContext,
const uno::Reference< frame::XModel >& xModel,
const uno::Any& aSource )
221 uno::Reference< text::XTextField > xTextField( aSource, uno::UNO_QUERY_THROW );
222 uno::Reference< text::XTextDocument > xTextDocument( xModel, uno::UNO_QUERY_THROW );
223 uno::Reference< word::XField > xField(
new SwVbaField( xParent, xContext, xTextField ) );
229 class FieldEnumeration :
public ::cppu::WeakImplHelper< css::container::XEnumeration >
231 uno::Reference< XHelperInterface >
mxParent;
232 uno::Reference< uno::XComponentContext >
mxContext;
233 uno::Reference< frame::XModel >
mxModel;
234 uno::Reference< container::XEnumeration > mxEnumeration;
236 FieldEnumeration(
const uno::Reference< XHelperInterface >& xParent,
const uno::Reference< uno::XComponentContext > & xContext,
const uno::Reference< frame::XModel >& xModel,
const uno::Reference< container::XEnumeration >& xEnumeration ) : mxParent( xParent ), mxContext( xContext ), mxModel( xModel ), mxEnumeration( xEnumeration )
239 virtual sal_Bool SAL_CALL hasMoreElements( )
override
241 return mxEnumeration->hasMoreElements();
243 virtual uno::Any SAL_CALL nextElement( )
override
245 if ( !hasMoreElements() )
246 throw container::NoSuchElementException();
247 return lcl_createField( mxParent, mxContext, mxModel, mxEnumeration->nextElement() );
251 class FieldCollectionHelper :
public ::cppu::WeakImplHelper< container::XIndexAccess,
252 container::XEnumerationAccess >
254 uno::Reference< XHelperInterface > mxParent;
255 uno::Reference< uno::XComponentContext > mxContext;
256 uno::Reference< frame::XModel > mxModel;
257 uno::Reference< container::XEnumerationAccess > mxEnumerationAccess;
260 FieldCollectionHelper(
const uno::Reference< XHelperInterface >& xParent,
const uno::Reference< uno::XComponentContext >& xContext,
const uno::Reference< frame::XModel >& xModel ) : mxParent( xParent ), mxContext( xContext ), mxModel( xModel )
262 uno::Reference< text::XTextFieldsSupplier > xSupp( xModel, uno::UNO_QUERY_THROW );
263 mxEnumerationAccess.set( xSupp->getTextFields(), uno::UNO_SET_THROW );
266 virtual uno::Type SAL_CALL getElementType( )
override {
return mxEnumerationAccess->getElementType(); }
267 virtual sal_Bool SAL_CALL hasElements( )
override {
return mxEnumerationAccess->hasElements(); }
269 virtual ::sal_Int32 SAL_CALL getCount( )
override
271 uno::Reference< container::XEnumeration > xEnumeration = mxEnumerationAccess->createEnumeration();
273 while( xEnumeration->hasMoreElements() )
276 xEnumeration->nextElement();
280 virtual uno::Any SAL_CALL getByIndex( ::sal_Int32
Index )
override
283 throw lang::IndexOutOfBoundsException();
285 uno::Reference< container::XEnumeration > xEnumeration = mxEnumerationAccess->createEnumeration();
286 sal_Int32 nCount = 0;
287 while( xEnumeration->hasMoreElements() )
289 if( nCount == Index )
291 return xEnumeration->nextElement();
295 throw lang::IndexOutOfBoundsException();
298 virtual uno::Reference< container::XEnumeration > SAL_CALL createEnumeration( )
override
300 uno::Reference< container::XEnumeration > xEnumeration = mxEnumerationAccess->createEnumeration();
301 return uno::Reference< container::XEnumeration >(
new FieldEnumeration( mxParent, mxContext, mxModel, xEnumeration ) );
307 SwVbaFields::SwVbaFields(
const uno::Reference< XHelperInterface >& xParent,
const uno::Reference< uno::XComponentContext > & xContext,
const uno::Reference< frame::XModel >& xModel ) :
SwVbaFields_BASE( xParent, xContext ,
uno::
Reference<
container::XIndexAccess >( new FieldCollectionHelper( xParent, xContext, xModel ) ) ), mxModel( xModel )
309 mxMSF.set( mxModel, uno::UNO_QUERY_THROW );
312 uno::Reference< word::XField > SAL_CALL
313 SwVbaFields::Add(
const css::uno::Reference< ::ooo::vba::word::XRange >&
Range,
const css::uno::Any&
Type,
const css::uno::Any& Text,
const css::uno::Any& )
315 sal_Int32
nType = word::WdFieldType::wdFieldEmpty;
321 if( ( nType == word::WdFieldType::wdFieldEmpty ) && !sText.isEmpty() )
323 SwVbaReadFieldParams aReadParam(sText);
324 sFieldName = aReadParam.GetFieldName();
325 SAL_INFO(
"sw.vba",
"the field name is " << sFieldName );
328 uno::Reference< text::XTextContent > xTextField;
329 if( nType == word::WdFieldType::wdFieldFileName || sFieldName.equalsIgnoreAsciiCase(
"FILENAME") )
333 else if( nType == word::WdFieldType::wdFieldDocProperty || sFieldName.equalsIgnoreAsciiCase(
"DOCPROPERTY") )
339 throw uno::RuntimeException(
"Not implemented" );
343 uno::Reference< text::XTextRange > xTextRange = rVbaRange.
getXTextRange();
344 uno::Reference< text::XText > xText = xTextRange->getText();
345 xText->insertTextContent( xTextRange, xTextField,
true );
346 return uno::Reference< word::XField >(
new SwVbaField( mxParent, mxContext, uno::Reference< text::XTextField >( xTextField, uno::UNO_QUERY_THROW ) ) );
351 uno::Reference< text::XTextField > xTextField(
mxMSF->createInstance(
"com.sun.star.text.TextField.FileName"), uno::UNO_QUERY_THROW );
352 sal_Int16 nFileFormat = text::FilenameDisplayFormat::NAME_AND_EXT;
353 if( !_text.isEmpty() )
356 SwVbaReadFieldParams aReadParam( _text );
357 while (-1 != (nRet = aReadParam.SkipToNextToken()))
362 nFileFormat = text::FilenameDisplayFormat::FULL;
366 aReadParam.SkipToNextToken();
375 uno::Reference< beans::XPropertySet > xProps( xTextField, uno::UNO_QUERY_THROW );
376 xProps->setPropertyValue(
"FileFormat",
uno::Any( nFileFormat ) );
383 struct DocPropertyTable
385 const char* sDocPropertyName;
386 const char* sFieldService;
393 {
"Author",
"com.sun.star.text.textfield.docinfo.CreateAuthor" },
394 {
"Bytes",
nullptr },
395 {
"Category",
nullptr },
396 {
"Characters",
nullptr },
397 {
"CharactersWithSpaces",
nullptr },
398 {
"Comments",
"com.sun.star.text.textfield.docinfo.Description" },
399 {
"Company",
nullptr },
400 {
"CreateTime",
"com.sun.star.text.textfield.docinfo.CreateDateTime" },
401 {
"HyperlinkBase",
nullptr },
402 {
"Keywords",
"com.sun.star.text.textfield.docinfo.Keywords" },
403 {
"LastPrinted",
"com.sun.star.text.textfield.docinfo.PrintDateTime" },
404 {
"LastSavedBy",
"com.sun.star.text.textfield.docinfo.ChangeAuthor" },
405 {
"LastSavedTime",
"com.sun.star.text.textfield.docinfo.ChangeDateTime" },
406 {
"Lines",
nullptr },
407 {
"Manager",
nullptr },
408 {
"NameofApplication",
nullptr },
409 {
"ODMADocID",
nullptr },
410 {
"Pages",
"com.sun.star.text.textfield.PageCount" },
411 {
"Paragraphs",
"com.sun.star.text.textfield.ParagraphCount" },
412 {
"RevisionNumber",
"com.sun.star.text.textfield.docinfo.Revision" },
413 {
"Security",
nullptr },
414 {
"Subject",
"com.sun.star.text.textfield.docinfo.Subject" },
415 {
"Template",
"com.sun.star.text.textfield.TemplateName" },
416 {
"Title",
"com.sun.star.text.textfield.docinfo.Title" },
417 {
"TotalEditingTime",
"com.sun.star.text.textfield.docinfo.EditTime" },
418 {
"Words",
"com.sun.star.text.textfield.WordCount" },
424 OUString aDocProperty;
425 SwVbaReadFieldParams aReadParam( _text );
427 while( -1 != ( nRet = aReadParam.SkipToNextToken() ))
432 if( aDocProperty.isEmpty() )
433 aDocProperty = aReadParam.GetResult();
437 aReadParam.SkipToNextToken();
441 aDocProperty = aDocProperty.replaceAll(
"\"",
"");
442 SAL_INFO(
"sw.vba",
"SwVbaFields::Create_Field_DocProperty, the document property name is " << aDocProperty );
443 if( aDocProperty.isEmpty() )
445 throw uno::RuntimeException();
449 OUString sFieldService;
451 for(
const DocPropertyTable* pTable = aDocPropertyTables; pTable->sDocPropertyName !=
nullptr; pTable++ )
453 if( aDocProperty.equalsIgnoreAsciiCaseAscii( pTable->sDocPropertyName ) )
455 if( pTable->sFieldService !=
nullptr )
456 sFieldService = OUString::createFromAscii(pTable->sFieldService);
464 sFieldService =
"com.sun.star.text.textfield.docinfo.Custom";
466 else if( sFieldService.isEmpty() )
468 throw uno::RuntimeException(
"Not implemented" );
471 uno::Reference< text::XTextField > xTextField(
mxMSF->createInstance( sFieldService ), uno::UNO_QUERY_THROW );
475 uno::Reference< beans::XPropertySet > xProps( xTextField, uno::UNO_QUERY_THROW );
476 xProps->setPropertyValue(
"Name",
uno::Any( aDocProperty ) );
482 uno::Reference< container::XEnumeration > SAL_CALL
485 uno::Reference< container::XEnumerationAccess > xEnumerationAccess(
m_xIndexAccess, uno::UNO_QUERY_THROW );
486 return xEnumerationAccess->createEnumeration();
498 sal_Int32 nUpdate = 1;
501 uno::Reference< text::XTextFieldsSupplier > xSupp( mxModel, uno::UNO_QUERY_THROW );
502 uno::Reference< util::XRefreshable > xRef( xSupp->getTextFields(), uno::UNO_QUERY_THROW );
506 catch(
const uno::Exception&)
517 return "SwVbaFields";
527 uno::Sequence<OUString>
532 "ooo.vba.word.Fields"
#define ERRCODE_BASIC_BAD_ARGUMENT
css::uno::Reference< css::container::XIndexAccess > m_xIndexAccess
WeakReference< XInterface > mxParent
css::uno::Reference< css::frame::XModel2 > mxModel
Sequence< OUString > aServiceNames
virtual OUString getServiceImplName() override
SwVbaFields(const css::uno::Reference< ov::XHelperInterface > &xParent, const css::uno::Reference< css::uno::XComponentContext > &xContext, const css::uno::Reference< css::frame::XModel > &xModel)
const DocPropertyTable aDocPropertyTables[]
exports com.sun.star. container
virtual css::uno::Reference< css::container::XEnumeration > SAL_CALL createEnumeration() override
css::uno::Reference< css::text::XTextField > Create_Field_FileName(const OUString &rText)
virtual css::uno::Reference< css::text::XTextRange > SAL_CALL getXTextRange() override
css::uno::Reference< css::text::XTextField > Create_Field_DocProperty(const OUString &_text)
virtual css::uno::Type SAL_CALL getElementType() override
css::uno::Reference< css::text::XTextField > mxTextField
constexpr OUStringLiteral aData
SwVbaField(const css::uno::Reference< ooo::vba::XHelperInterface > &rParent, const css::uno::Reference< css::uno::XComponentContext > &rContext, const css::uno::Reference< css::text::XTextField > &xTextField)
virtual OUString getServiceImplName() override
css::uno::Reference< css::lang::XMultiServiceFactory > mxMSF
virtual sal_Int32 SAL_CALL Update() override
css::uno::Type const & get()
virtual css::uno::Reference< ::ooo::vba::word::XField > SAL_CALL Add(const css::uno::Reference< ::ooo::vba::word::XRange > &Range, const css::uno::Any &Type, const css::uno::Any &Text, const css::uno::Any &PreserveFormatting) override
static uno::Any lcl_createField(const uno::Reference< XHelperInterface > &xParent, const uno::Reference< uno::XComponentContext > &xContext, const uno::Reference< frame::XModel > &xModel, const uno::Any &aSource)
virtual css::uno::Sequence< OUString > getServiceNames() override
#define SAL_INFO(area, stream)
void copy(const fs::path &src, const fs::path &dest)
double getLength(const B2DPolygon &rCandidate)
virtual sal_Bool SAL_CALL Update() override
virtual css::uno::Any createCollectionObject(const css::uno::Any &aSource) override
virtual css::uno::Sequence< OUString > getServiceNames() override