summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unobkm.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/unocore/unobkm.cxx')
-rw-r--r--sw/source/core/unocore/unobkm.cxx170
1 files changed, 159 insertions, 11 deletions
diff --git a/sw/source/core/unocore/unobkm.cxx b/sw/source/core/unocore/unobkm.cxx
index 233d14b23421..853418742a72 100644
--- a/sw/source/core/unocore/unobkm.cxx
+++ b/sw/source/core/unocore/unobkm.cxx
@@ -138,6 +138,11 @@ IDocumentMarkAccess* SwXBookmark::GetIDocumentMarkAccess()
return m_pImpl->m_pDoc->getIDocumentMarkAccess();
}
+SwDoc * SwXBookmark::GetDoc()
+{
+ return m_pImpl->m_pDoc;
+}
+
SwXBookmark::SwXBookmark(SwDoc *const pDoc)
: m_pImpl( new SwXBookmark::Impl(pDoc) )
{
@@ -518,10 +523,6 @@ SwXBookmark::removeVetoableChangeListener(
OSL_FAIL("SwXBookmark::removeVetoableChangeListener(): not implemented");
}
-SwXFieldmark::SwXFieldmark(bool _isReplacementObject, SwDoc* pDc)
- : SwXFieldmark_Base(pDc)
- , m_bReplacementObject(_isReplacementObject)
-{ }
void SwXFieldmarkParameters::insertByName(const OUString& aName, const uno::Any& aElement)
{
@@ -597,6 +598,36 @@ IFieldmark::parameter_map_t* SwXFieldmarkParameters::getCoreParameters()
return m_pFieldmark->GetParameters();
}
+SwXFieldmark::SwXFieldmark(bool const isReplacementObject, SwDoc *const pDoc)
+ : SwXFieldmark_Base(pDoc)
+ , m_bReplacementObject(isReplacementObject)
+{
+}
+
+OUString SAL_CALL
+SwXFieldmark::getImplementationName()
+{
+ return "SwXFieldmark";
+}
+
+uno::Sequence<OUString> SAL_CALL
+SwXFieldmark::getSupportedServiceNames()
+{
+ // is const, no lock needed
+ if (m_bReplacementObject)
+ {
+ return {"com.sun.star.text.TextContent",
+ "com.sun.star.text.Bookmark",
+ "com.sun.star.text.FormFieldmark"};
+ }
+ else
+ {
+ return {"com.sun.star.text.TextContent",
+ "com.sun.star.text.Bookmark",
+ "com.sun.star.text.Fieldmark"};
+ }
+}
+
void SwXFieldmark::attachToRange( const uno::Reference < text::XTextRange >& xTextRange )
{
@@ -619,9 +650,12 @@ void SwXFieldmark::setFieldType(const OUString & fieldType)
IFieldmark *pBkm = dynamic_cast<IFieldmark*>(GetBookmark());
if(!pBkm)
throw uno::RuntimeException();
- if(fieldType == getFieldType())
+
+ OUString const oldFieldType(getFieldType());
+ if (fieldType == oldFieldType)
return;
+ // note: this must not change between point-fieldmarks and range-fieldmarks
if(fieldType == ODF_FORMDROPDOWN || fieldType == ODF_FORMCHECKBOX || fieldType == ODF_FORMDATE)
{
::sw::mark::IFieldmark* pNewFieldmark = GetIDocumentMarkAccess()->changeFormFieldmarkType(pBkm, fieldType);
@@ -632,8 +666,17 @@ void SwXFieldmark::setFieldType(const OUString & fieldType)
}
}
- // We did not generate a new fieldmark, so set the type ID
- pBkm->SetFieldname(fieldType);
+ if ((!m_bReplacementObject && (fieldType == ODF_UNHANDLED
+ || fieldType == ODF_FORMDATE
+ || fieldType == ODF_FORMTEXT))
+ || (m_bReplacementObject && (fieldType == ODF_FORMCHECKBOX
+ || fieldType == ODF_FORMDROPDOWN)))
+ {
+ pBkm->SetFieldname(fieldType);
+ return;
+ }
+
+ throw uno::RuntimeException("changing to that type isn't implemented");
}
uno::Reference<container::XNameContainer> SwXFieldmark::getParameters()
@@ -673,7 +716,7 @@ SwXFieldmark::CreateXFieldmark(SwDoc & rDoc, ::sw::mark::IMark *const pMark,
else
pXBkmk = new SwXFieldmark(isReplacementObject, &rDoc);
- xMark.set(pXBkmk);
+ xMark.set(static_cast<::cppu::OWeakObject*>(pXBkmk), uno::UNO_QUERY); // work around ambiguous base
pXBkmk->registerInMark(*pXBkmk, pMarkBase);
}
return xMark;
@@ -710,8 +753,7 @@ SwXFieldmark::setPropertyValue(const OUString& PropertyName,
pCheckboxFm->SetChecked( bChecked );
}
- else
- SwXFieldmark_Base::setPropertyValue( PropertyName, rValue );
+ // this doesn't support any SwXBookmark property
}
// support 'hidden' "Checked" property ( note: this property is just for convenience to support
@@ -728,7 +770,113 @@ uno::Any SAL_CALL SwXFieldmark::getPropertyValue(const OUString& rPropertyName)
return uno::makeAny( pCheckboxFm->IsChecked() );
}
- return SwXFieldmark_Base::getPropertyValue( rPropertyName );
+ return uno::Any(); // this doesn't support any SwXBookmark property
+}
+
+uno::Reference<beans::XPropertySetInfo> SAL_CALL
+SwXFieldmark::getPropertySetInfo()
+{
+ SolarMutexGuard g;
+
+ static uno::Reference<beans::XPropertySetInfo> const xRef(
+ aSwMapProvider.GetPropertySet(PROPERTY_MAP_FIELDMARK)
+ ->getPropertySetInfo() );
+ return xRef;
+}
+
+// XComponent
+void SAL_CALL SwXFieldmark::dispose()
+{
+ return SwXBookmark::dispose();
+}
+void SAL_CALL SwXFieldmark::addEventListener(
+ uno::Reference<lang::XEventListener> const& xListener)
+{
+ return SwXBookmark::addEventListener(xListener);
+}
+void SAL_CALL SwXFieldmark::removeEventListener(
+ uno::Reference<lang::XEventListener> const& xListener)
+{
+ return SwXBookmark::removeEventListener(xListener);
+}
+
+// XTextContent
+void SAL_CALL SwXFieldmark::attach(
+ uno::Reference<text::XTextRange> const& xTextRange)
+{
+ return SwXBookmark::attach(xTextRange);
+}
+
+uno::Reference<text::XTextRange> SAL_CALL SwXFieldmark::getAnchor()
+{
+ return SwXBookmark::getAnchor();
+}
+
+uno::Reference<text::XTextRange>
+SwXFieldmark::GetCommand(IFieldmark const& rMark)
+{
+ SwPosition const sepPos(sw::mark::FindFieldSep(rMark));
+ SwPosition start(rMark.GetMarkStart());
+ ++start.nContent;
+ return SwXTextRange::CreateXTextRange(*GetDoc(), start, &sepPos);
+}
+
+uno::Reference<text::XTextRange>
+SwXFieldmark::GetResult(IFieldmark const& rMark)
+{
+ SwPosition sepPos(sw::mark::FindFieldSep(rMark));
+ ++sepPos.nContent;
+ SwPosition const& rEnd(rMark.GetMarkEnd());
+ return SwXTextRange::CreateXTextRange(*GetDoc(), sepPos, &rEnd);
+}
+
+// XTextField
+OUString SAL_CALL
+SwXFieldmark::getPresentation(sal_Bool const bShowCommand)
+{
+ SolarMutexGuard g;
+
+ IFieldmark const*const pMark(dynamic_cast<IFieldmark*>(GetBookmark()));
+ if (!pMark)
+ {
+ throw lang::DisposedException();
+ }
+
+ if (bShowCommand)
+ {
+ if (m_bReplacementObject)
+ {
+ return OUString();
+ }
+ else
+ { // also for ODF_FORMDATE, which shouldn't be a fieldmark...
+ uno::Reference<text::XTextRange> const xCommand(GetCommand(*pMark));
+ return xCommand->getString();
+ }
+ }
+ else
+ {
+ OUString const type(getFieldType());
+ if (type == ODF_FORMCHECKBOX)
+ {
+ ::sw::mark::ICheckboxFieldmark const*const pCheckboxFm(
+ dynamic_cast<ICheckboxFieldmark const*>(pMark));
+ assert(pCheckboxFm);
+ return pCheckboxFm->IsChecked()
+ ? OUString(u"\u2612")
+ : OUString(u"\u2610");
+ }
+ else if (type == ODF_FORMDROPDOWN)
+ {
+ return sw::mark::ExpandFieldmark(const_cast<IFieldmark *>(pMark));
+ }
+ else
+ {
+ assert(!m_bReplacementObject);
+ uno::Reference<text::XTextRange> const xResult(GetResult(*pMark));
+ return xResult->getString();
+ }
+ }
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */