summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editeng/source/accessibility/AccessibleEditableTextPara.cxx3
-rw-r--r--editeng/source/items/CustomPropertyField.cxx19
-rw-r--r--editeng/source/items/flditem.cxx11
-rw-r--r--editeng/source/uno/unofield.cxx41
-rw-r--r--include/editeng/CustomPropertyField.hxx18
-rw-r--r--include/editeng/unonames.hxx6
-rw-r--r--offapi/com/sun/star/text/textfield/Type.idl4
-rw-r--r--sd/source/ui/app/sdmod2.cxx16
-rw-r--r--sd/source/ui/unoidl/unomodel.cxx6
-rw-r--r--sd/source/ui/view/drviews2.cxx14
10 files changed, 114 insertions, 24 deletions
diff --git a/editeng/source/accessibility/AccessibleEditableTextPara.cxx b/editeng/source/accessibility/AccessibleEditableTextPara.cxx
index a8e7a90017ed..b7931eef21c4 100644
--- a/editeng/source/accessibility/AccessibleEditableTextPara.cxx
+++ b/editeng/source/accessibility/AccessibleEditableTextPara.cxx
@@ -901,6 +901,9 @@ namespace
case text::textfield::Type::DOCINFO_TITLE:
strFldType = "file name";
break;
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ strFldType = "custom document property";
+ break;
default:
break;
}
diff --git a/editeng/source/items/CustomPropertyField.cxx b/editeng/source/items/CustomPropertyField.cxx
index 7145bc72c650..70a6a40197b2 100644
--- a/editeng/source/items/CustomPropertyField.cxx
+++ b/editeng/source/items/CustomPropertyField.cxx
@@ -22,9 +22,10 @@ CustomPropertyField::CustomPropertyField()
: SvxFieldData()
{}
-CustomPropertyField::CustomPropertyField(OUString const & rKey)
+CustomPropertyField::CustomPropertyField(OUString const & rName, OUString const & rCurrentPresentation)
: SvxFieldData()
- , msKey(rKey)
+ , msName(rName)
+ , msCurrentPresentation(rCurrentPresentation)
{}
CustomPropertyField::~CustomPropertyField()
@@ -34,7 +35,7 @@ SV_IMPL_PERSIST1(CustomPropertyField);
SvxFieldData* CustomPropertyField::Clone() const
{
- return new CustomPropertyField(msKey);
+ return new CustomPropertyField(msName, msCurrentPresentation);
}
bool CustomPropertyField::operator==(const SvxFieldData& rOther) const
@@ -43,7 +44,8 @@ bool CustomPropertyField::operator==(const SvxFieldData& rOther) const
return false;
const CustomPropertyField& rOtherField = static_cast<const CustomPropertyField&>(rOther);
- return (msKey == rOtherField.msKey);
+ return (msName == rOtherField.msName &&
+ msCurrentPresentation == rOtherField.msCurrentPresentation);
}
MetaAction* CustomPropertyField::createBeginComment() const
@@ -51,8 +53,10 @@ MetaAction* CustomPropertyField::createBeginComment() const
return new MetaCommentAction("FIELD_SEQ_BEGIN");
}
-OUString CustomPropertyField::GetFormatted(uno::Reference<document::XDocumentProperties> const & xDocumentProperties) const
+OUString CustomPropertyField::GetFormatted(uno::Reference<document::XDocumentProperties> const & xDocumentProperties)
{
+ if (msName.isEmpty())
+ return OUString();
if (!xDocumentProperties.is())
return OUString();
uno::Reference<beans::XPropertyContainer> xPropertyContainer = xDocumentProperties->getUserDefinedProperties();
@@ -61,10 +65,11 @@ OUString CustomPropertyField::GetFormatted(uno::Reference<document::XDocumentPro
uno::Reference<beans::XPropertySet> xPropertySet(xPropertyContainer, uno::UNO_QUERY);
if (!xPropertySet.is())
return OUString();
- uno::Any aAny = xPropertySet->getPropertyValue(msKey);
+ uno::Any aAny = xPropertySet->getPropertyValue(msName);
if (!aAny.has<OUString>())
return OUString();
- return aAny.get<OUString>();
+ msCurrentPresentation = aAny.get<OUString>();
+ return msCurrentPresentation;
}
} // end editeng namespace
diff --git a/editeng/source/items/flditem.cxx b/editeng/source/items/flditem.cxx
index bbdd2b7036d0..4435fcf490b9 100644
--- a/editeng/source/items/flditem.cxx
+++ b/editeng/source/items/flditem.cxx
@@ -24,6 +24,7 @@
#include <tools/urlobj.hxx>
#include <editeng/flditem.hxx>
+#include <editeng/CustomPropertyField.hxx>
#include <editeng/measfld.hxx>
#include <editeng/unonames.hxx>
@@ -216,6 +217,16 @@ SvxFieldData* SvxFieldData::Create(const uno::Reference<text::XTextContent>& xTe
return new SvxFooterField();
case text::textfield::Type::PRESENTATION_DATE_TIME:
return new SvxDateTimeField();
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ {
+ OUString sName;
+ xPropSet->getPropertyValue(UNO_TC_PROP_NAME) >>= sName;
+
+ OUString sCurrentPresentation;
+ xPropSet->getPropertyValue(UNO_TC_PROP_CURRENT_PRESENTATION) >>= sCurrentPresentation;
+
+ return new editeng::CustomPropertyField(sName, sCurrentPresentation);
+ }
default:
;
};
diff --git a/editeng/source/uno/unofield.cxx b/editeng/source/uno/unofield.cxx
index 55fb74bcc999..b2f416c7c78e 100644
--- a/editeng/source/uno/unofield.cxx
+++ b/editeng/source/uno/unofield.cxx
@@ -25,6 +25,7 @@
#include <editeng/eeitem.hxx>
#include <editeng/flditem.hxx>
+#include <editeng/CustomPropertyField.hxx>
#include <editeng/measfld.hxx>
#include <editeng/unofield.hxx>
#include <editeng/unotext.hxx>
@@ -128,6 +129,17 @@ const SfxItemPropertySet* ImplGetFieldItemPropertySet( sal_Int32 mnId )
};
static const SfxItemPropertySet aMeasureFieldPropertySet_Impl(aMeasureFieldPropertyMap_Impl);
+ static const SfxItemPropertyMapEntry aDocInfoCustomFieldPropertyMap_Impl[] =
+ {
+ { OUString(UNO_TC_PROP_NAME), WID_STRING1, cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString(UNO_TC_PROP_CURRENT_PRESENTATION), WID_STRING2, cppu::UnoType<OUString>::get(), 0, 0 },
+ { OUString(UNO_TC_PROP_IS_FIXED), WID_BOOL1, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString(UNO_TC_PROP_NUMFORMAT), WID_INT32, cppu::UnoType<sal_Int32>::get(), 0, 0 },
+ { OUString(UNO_TC_PROP_IS_FIXED_LANGUAGE), WID_BOOL2, cppu::UnoType<bool>::get(), 0, 0 },
+ { OUString(), 0, css::uno::Type(), 0, 0 }
+ };
+ static const SfxItemPropertySet aDocInfoCustomFieldPropertySet_Impl(aDocInfoCustomFieldPropertyMap_Impl);
+
switch( mnId )
{
case text::textfield::Type::EXTENDED_TIME:
@@ -143,6 +155,8 @@ const SfxItemPropertySet* ImplGetFieldItemPropertySet( sal_Int32 mnId )
return &aAuthorFieldPropertySet_Impl;
case text::textfield::Type::MEASURE:
return &aMeasureFieldPropertySet_Impl;
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ return &aDocInfoCustomFieldPropertySet_Impl;
default:
return &aEmptyPropertySet_Impl;
}
@@ -281,6 +295,12 @@ SvxUnoTextField::SvxUnoTextField( sal_Int32 nServiceId ) throw()
mpImpl->mnInt16 = static_cast<sal_uInt16>(SdrMeasureFieldKind::Value);
break;
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ mpImpl->mbBoolean1 = true;
+ mpImpl->mbBoolean2 = true;
+ mpImpl->mnInt32 = 0;
+ break;
+
default:
mpImpl->mbBoolean1 = false;
mpImpl->mbBoolean2 = false;
@@ -364,6 +384,14 @@ SvxUnoTextField::SvxUnoTextField( uno::Reference< text::XTextRange > const & xAn
mpImpl->mnInt16 = sal::static_int_cast< sal_Int16 >(static_cast<const SdrMeasureField*>(pData)->GetMeasureFieldKind());
break;
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ mpImpl->msString1 = static_cast<const editeng::CustomPropertyField*>(pData)->GetName();
+ mpImpl->msString2 = static_cast<const editeng::CustomPropertyField*>(pData)->GetCurrentPresentation();
+ mpImpl->mbBoolean1 = false;
+ mpImpl->mbBoolean2 = false;
+ mpImpl->mnInt32 = 0;
+ break;
+
default:
SAL_WARN("editeng", "Id service unknown: " << mnServiceId);
break;
@@ -512,6 +540,9 @@ SvxFieldData* SvxUnoTextField::CreateFieldData() const throw()
case text::textfield::Type::PAGE_NAME:
pData = new SvxPageTitleField();
break;
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ pData = new editeng::CustomPropertyField(mpImpl->msString1, mpImpl->msString2);
+ break;
};
return pData;
@@ -611,6 +642,8 @@ OUString SAL_CALL SvxUnoTextField::getPresentation( sal_Bool bShowCommand )
return OUString("DateTime");
case text::textfield::Type::PAGE_NAME:
return OUString("PageName");
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ return OUString("Custom");
default:
return OUString("Unknown");
}
@@ -853,6 +886,10 @@ uno::Sequence< OUString > SAL_CALL SvxUnoTextField::getSupportedServiceNames()
pServices[2] = "com.sun.star.text.TextField.PageName";
pServices[3] = "com.sun.star.text.textfield.PageName";
break;
+ case text::textfield::Type::DOCINFO_CUSTOM:
+ pServices[2] = "com.sun.star.text.TextField.DocInfo.Custom";
+ pServices[3] = "com.sun.star.text.textfield.DocInfo.Custom";
+ break;
default:
aSeq.realloc(0);
}
@@ -918,6 +955,10 @@ uno::Reference< uno::XInterface > SAL_CALL SvxUnoTextCreateTextField( const OUSt
{
nId = text::textfield::Type::MEASURE;
}
+ else if (aFieldType == "DocInfo.Custom")
+ {
+ nId = text::textfield::Type::DOCINFO_CUSTOM;
+ }
if (nId != text::textfield::Type::UNSPECIFIED)
xRet = static_cast<cppu::OWeakObject *>(new SvxUnoTextField( nId ));
diff --git a/include/editeng/CustomPropertyField.hxx b/include/editeng/CustomPropertyField.hxx
index 3d862007c1f6..687b4a171375 100644
--- a/include/editeng/CustomPropertyField.hxx
+++ b/include/editeng/CustomPropertyField.hxx
@@ -26,26 +26,32 @@ namespace editeng
class EDITENG_DLLPUBLIC CustomPropertyField : public SvxFieldData
{
private:
- OUString msKey;
+ OUString msName;
+ OUString msCurrentPresentation;
public:
CustomPropertyField();
- explicit CustomPropertyField(OUString const & rKey);
+ explicit CustomPropertyField(OUString const & rName, OUString const & rCurrentPresentation);
virtual ~CustomPropertyField() override;
- SV_DECL_PERSIST1(CustomPropertyField, css::text::textfield::Type::CUSTOM_PROPERTY)
+ SV_DECL_PERSIST1(CustomPropertyField, css::text::textfield::Type::DOCINFO_CUSTOM)
virtual SvxFieldData* Clone() const override;
virtual bool operator==(const SvxFieldData&) const override;
virtual MetaAction* createBeginComment() const override;
- OUString GetFormatted(css::uno::Reference<css::document::XDocumentProperties> const & xDocumentProperties) const;
+ OUString GetFormatted(css::uno::Reference<css::document::XDocumentProperties> const & xDocumentProperties);
- OUString GetKey() const
+ OUString GetName() const
{
- return msKey;
+ return msName;
+ }
+
+ OUString GetCurrentPresentation() const
+ {
+ return msCurrentPresentation;
}
};
diff --git a/include/editeng/unonames.hxx b/include/editeng/unonames.hxx
index f3e3a8047e67..de2e1fcf6c47 100644
--- a/include/editeng/unonames.hxx
+++ b/include/editeng/unonames.hxx
@@ -15,11 +15,15 @@
#define UNO_TC_PROP_TEXTFIELD_TYPE "TextFieldType"
#define UNO_TC_PROP_IS_FIXED "IsFixed"
#define UNO_TC_PROP_CURRENT_PRESENTATION "CurrentPresentation"
+#define UNO_TC_PROP_NAME "Name"
+#define UNO_TC_PROP_IS_FIXED_LANGUAGE "IsFixedLanguage"
+#define UNO_TC_PROP_NUMFORMAT "NumberFormat"
+#define UNO_TC_PROP_USED "IsFieldUsed"
+#define UNO_TC_PROP_DISPLAYED "IsFieldDisplayed"
// Date & Time
#define UNO_TC_PROP_IS_DATE "IsDate"
#define UNO_TC_PROP_DATE_TIME "DateTime"
-#define UNO_TC_PROP_NUMFORMAT "NumberFormat"
// URL
#define UNO_TC_PROP_URL_FORMAT "Format"
diff --git a/offapi/com/sun/star/text/textfield/Type.idl b/offapi/com/sun/star/text/textfield/Type.idl
index 454b1c765a8a..648400a224ba 100644
--- a/offapi/com/sun/star/text/textfield/Type.idl
+++ b/offapi/com/sun/star/text/textfield/Type.idl
@@ -42,8 +42,8 @@ constants Type
const long PRESENTATION_HEADER = 11;
const long PRESENTATION_FOOTER = 12;
const long PRESENTATION_DATE_TIME = 13;
- const long PAGE_NAME = 14;
- const long CUSTOM_PROPERTY = 15;
+ const long PAGE_NAME = 14;
+ const long DOCINFO_CUSTOM = 15;
};
}; }; }; }; };
diff --git a/sd/source/ui/app/sdmod2.cxx b/sd/source/ui/app/sdmod2.cxx
index 29b8b9798228..b7b51f41917c 100644
--- a/sd/source/ui/app/sdmod2.cxx
+++ b/sd/source/ui/app/sdmod2.cxx
@@ -349,7 +349,21 @@ IMPL_LINK(SdModule, CalcFieldValueHdl, EditFieldInfo*, pInfo, void)
}
else if ((pCustomPropertyField = dynamic_cast<const editeng::CustomPropertyField*>(pField)) != nullptr)
{
- pInfo->SetRepresentation(pCustomPropertyField->GetFormatted(SfxObjectShell::Current()->getDocProperties()));
+ try
+ {
+ if (SfxObjectShell::Current() && SfxObjectShell::Current()->IsLoadingFinished())
+ {
+ auto pNonConstCustomPropertyField = const_cast<editeng::CustomPropertyField*>(pCustomPropertyField);
+ OUString sCurrent = pNonConstCustomPropertyField->GetFormatted(SfxObjectShell::Current()->getDocProperties());
+ pInfo->SetRepresentation(sCurrent);
+ }
+ else
+ pInfo->SetRepresentation(pCustomPropertyField->GetCurrentPresentation());
+ }
+ catch (...)
+ {
+ pInfo->SetRepresentation(pCustomPropertyField->GetCurrentPresentation());
+ }
}
else
{
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 63964904173b..4cd01e61acff 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -926,6 +926,12 @@ css::uno::Reference<css::uno::XInterface> SdXImpressDocument::create(
return static_cast<cppu::OWeakObject *>(new SvxUnoTextField( text::textfield::Type::PAGE_NAME ));
}
+ if (aServiceSpecifier == "com.sun.star.text.TextField.DocInfo.Custom" ||
+ aServiceSpecifier == "com.sun.star.text.textfield.DocInfo.Custom")
+ {
+ return static_cast<cppu::OWeakObject *>(new SvxUnoTextField(text::textfield::Type::DOCINFO_CUSTOM));
+ }
+
if( aServiceSpecifier == "com.sun.star.xml.NamespaceMap" )
{
static sal_uInt16 aWhichIds[] = { SDRATTR_XMLATTRIBUTES, EE_CHAR_XMLATTRIBS, EE_PARA_XMLATTRIBS, 0 };
diff --git a/sd/source/ui/view/drviews2.cxx b/sd/source/ui/view/drviews2.cxx
index 4d1eca41992b..6959bd726536 100644
--- a/sd/source/ui/view/drviews2.cxx
+++ b/sd/source/ui/view/drviews2.cxx
@@ -244,7 +244,7 @@ const SvxFieldItem* findField(editeng::Section const & rSection)
return nullptr;
}
-bool hasCustomPropertyField(std::vector<editeng::Section> const & aSections, OUString const & rKey)
+bool hasCustomPropertyField(std::vector<editeng::Section> const & aSections, OUString const & rName)
{
for (editeng::Section const & rSection : aSections)
{
@@ -252,7 +252,7 @@ bool hasCustomPropertyField(std::vector<editeng::Section> const & aSections, OUS
if (pFieldItem)
{
const editeng::CustomPropertyField* pCustomPropertyField = dynamic_cast<const editeng::CustomPropertyField*>(pFieldItem->GetField());
- if (pCustomPropertyField && pCustomPropertyField->GetKey() == rKey)
+ if (pCustomPropertyField && pCustomPropertyField->GetName() == rName)
return true;
}
}
@@ -315,7 +315,7 @@ private:
if (pFieldItem)
{
const auto* pCustomPropertyField = dynamic_cast<const editeng::CustomPropertyField*>(pFieldItem->GetField());
- OUString aKey = pCustomPropertyField->GetKey();
+ OUString aKey = pCustomPropertyField->GetName();
if (aKeyCreator.isMarkingTextKey(aKey))
{
OUString aValue = lcl_getProperty(xPropertyContainer, aKey);
@@ -490,14 +490,14 @@ public:
{
OUString sKey = aKeyCreator.makeNumberedMarkingTextKey();
addOrInsertDocumentProperty(xPropertyContainer, sKey, rResult.msString);
- pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey), EE_FEATURE_FIELD), aPosition);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msString), EE_FEATURE_FIELD), aPosition);
}
break;
case svx::ClassificationType::CATEGORY:
{
OUString sKey = aKeyCreator.makeCategoryKey();
- pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey), EE_FEATURE_FIELD), aPosition);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msString), EE_FEATURE_FIELD), aPosition);
}
break;
@@ -505,7 +505,7 @@ public:
{
OUString sKey = aKeyCreator.makeMarkingKey();
addOrInsertDocumentProperty(xPropertyContainer, sKey, rResult.msString);
- pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey), EE_FEATURE_FIELD), aPosition);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msString), EE_FEATURE_FIELD), aPosition);
}
break;
@@ -513,7 +513,7 @@ public:
{
OUString sKey = aKeyCreator.makeIntellectualPropertyPartKey();
addOrInsertDocumentProperty(xPropertyContainer, sKey, rResult.msString);
- pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey), EE_FEATURE_FIELD), aPosition);
+ pOutliner->QuickInsertField(SvxFieldItem(editeng::CustomPropertyField(sKey, rResult.msString), EE_FEATURE_FIELD), aPosition);
}
break;