summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzymon Kłos <szymon.klos@collabora.com>2023-05-30 14:09:25 +0200
committerSzymon Kłos <szymon.klos@collabora.com>2023-07-12 07:56:37 +0200
commite78f60a369146774ca2a38ca121f294b562b2be5 (patch)
tree46eb6ec25611b03400c46cf089c7fa28563d6d5a
parent43c564da59d7d951ee9a903b80e82fd1159d0c71 (diff)
Categories for link targets in Impress
Writer and Calc presented possible link targets inside documents as a Tree, with items under their categories. This patch makes the same for Impress so we don't mix master pages with regular pages. Change-Id: Ifd98300b0d609c28d6c1880332fff7e750b5e1b2 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/152389 Reviewed-by: Gülşah Köse <gulsah.kose@collabora.com> Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-on: https://gerrit.libreoffice.org/c/core/+/153985 Tested-by: Jenkins Reviewed-by: Szymon Kłos <szymon.klos@collabora.com>
-rw-r--r--pyuno/qa/pytests/testcollections_XNameAccess.py25
-rw-r--r--sd/inc/strings.hrc1
-rw-r--r--sd/source/ui/inc/unomodel.hxx69
-rw-r--r--sd/source/ui/unoidl/unomodel.cxx298
4 files changed, 324 insertions, 69 deletions
diff --git a/pyuno/qa/pytests/testcollections_XNameAccess.py b/pyuno/qa/pytests/testcollections_XNameAccess.py
index 79d66a2e1bc2..5c5ad6890be2 100644
--- a/pyuno/qa/pytests/testcollections_XNameAccess.py
+++ b/pyuno/qa/pytests/testcollections_XNameAccess.py
@@ -28,10 +28,14 @@ class TestXNameAccess(CollectionsTestBase):
drw = self.createBlankDrawing()
# When
- length = len(drw.Links)
+ length_categories = len(drw.Links)
+ length_slides = len(drw.Links['Slide'].Links)
+ length_master = len(drw.Links['Master Page'].Links)
# Then
- self.assertEqual(2, length)
+ self.assertEqual(4, length_categories)
+ self.assertEqual(1, length_slides)
+ self.assertEqual(1, length_master)
drw.close(True)
@@ -45,7 +49,7 @@ class TestXNameAccess(CollectionsTestBase):
drw.DrawPages[0].Name = 'foo'
# When
- link = drw.Links['foo']
+ link = drw.Links['Slide'].Links['foo']
# Then
self.assertEqual('foo', link.getName())
@@ -62,7 +66,7 @@ class TestXNameAccess(CollectionsTestBase):
# When / Then
with self.assertRaises(KeyError):
- link = drw.Links['foo']
+ link = drw.Links['Slide'].Links['foo']
drw.close(True)
@@ -146,7 +150,7 @@ class TestXNameAccess(CollectionsTestBase):
drw.DrawPages[0].Name = 'foo'
# When
- present = 'foo' in drw.Links
+ present = 'foo' in drw.Links['Slide'].Links
# Then
self.assertTrue(present)
@@ -161,17 +165,17 @@ class TestXNameAccess(CollectionsTestBase):
# Given
drw = self.createBlankDrawing()
i = 0
- for name in drw.Links.getElementNames():
- drw.Links.getByName(name).Name = 'foo' + str(i)
+ for name in drw.Links['Slide'].Links.getElementNames():
+ drw.Links['Slide'].Links.getByName(name).Name = 'foo' + str(i)
i += 1
# When
read_links = []
- for link in drw.Links:
+ for link in drw.Links['Slide'].Links:
read_links.append(link)
# Then
- self.assertEqual(['foo0', 'foo1'], read_links)
+ self.assertEqual(['foo0'], read_links)
drw.close(True)
@@ -184,11 +188,10 @@ class TestXNameAccess(CollectionsTestBase):
drw = self.createBlankDrawing()
# When
- itr = iter(drw.Links)
+ itr = iter(drw.Links['Slide'].Links)
# Then
self.assertIsNotNone(next(itr))
- self.assertIsNotNone(next(itr))
with self.assertRaises(StopIteration):
next(itr)
diff --git a/sd/inc/strings.hrc b/sd/inc/strings.hrc
index 3e1ddd1542e7..0d9303e18bea 100644
--- a/sd/inc/strings.hrc
+++ b/sd/inc/strings.hrc
@@ -95,6 +95,7 @@
#define STR_VOC_FILE NC_("STR_VOC_FILE", "Creative Labs Audio")
#define STR_AIFF_FILE NC_("STR_AIFF_FILE", "Apple/SGI Audio")
#define STR_SVX_FILE NC_("STR_SVX_FILE", "Amiga SVX Audio")
+#define STR_SD_PAGE NC_("STR_SD_PAGE", "Slide")
#define STR_SD_PAGE_COUNT NC_("STR_SD_PAGE_COUNT", "Slide %1 of %2")
#define STR_SD_PAGE_COUNT_CUSTOM NC_("STR_SD_PAGE_COUNT_CUSTOM", "Slide %1 of %2 (%3)")
#define STR_SD_PAGE_COUNT_DRAW NC_("STR_SD_PAGE_COUNT_DRAW", "Page %1 of %2")
diff --git a/sd/source/ui/inc/unomodel.hxx b/sd/source/ui/inc/unomodel.hxx
index f31d93b97420..eba78ce17fb7 100644
--- a/sd/source/ui/inc/unomodel.hxx
+++ b/sd/source/ui/inc/unomodel.hxx
@@ -380,11 +380,21 @@ public:
* *
***********************************************************************/
+enum SdLinkTargetType
+{
+ Page = 0,
+ Notes,
+ Handout,
+ MasterPage,
+ Count
+};
+
class SdDocLinkTargets final : public ::cppu::WeakImplHelper< css::container::XNameAccess,
css::lang::XServiceInfo , css::lang::XComponent >
{
private:
SdXImpressDocument* mpModel;
+ OUString aNames[SdLinkTargetType::Count];
public:
SdDocLinkTargets( SdXImpressDocument& rMyModel ) noexcept;
@@ -408,6 +418,65 @@ public:
virtual void SAL_CALL dispose( ) override;
virtual void SAL_CALL addEventListener( const css::uno::Reference< css::lang::XEventListener >& xListener ) override;
virtual void SAL_CALL removeEventListener( const css::uno::Reference< css::lang::XEventListener >& aListener ) override;
+};
+
+class SdDocLinkTargetType final : public ::cppu::WeakImplHelper< css::document::XLinkTargetSupplier,
+ css::beans::XPropertySet,
+ css::lang::XServiceInfo >
+{
+ SdXImpressDocument* mpModel;
+ sal_uInt16 mnType;
+ OUString maName;
+
+public:
+ SdDocLinkTargetType(SdXImpressDocument* pModel, sal_uInt16 nT) noexcept;
+
+ // css::document::XLinkTargetSupplier
+ virtual css::uno::Reference< css::container::XNameAccess > SAL_CALL getLinks() override;
+
+ // css::lang::XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService( const OUString& ServiceName ) override;
+ virtual css::uno::Sequence< OUString> SAL_CALL getSupportedServiceNames() override;
+
+ // css::beans::XPropertySet
+ virtual css::uno::Reference< css::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo() override;
+ virtual void SAL_CALL setPropertyValue(const OUString& aPropertyName,
+ const css::uno::Any& aValue) override;
+ virtual css::uno::Any SAL_CALL getPropertyValue(const OUString& PropertyName) override;
+ virtual void SAL_CALL addPropertyChangeListener(const OUString& aPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener > & xListener) override;
+ virtual void SAL_CALL removePropertyChangeListener(const OUString& aPropertyName,
+ const css::uno::Reference< css::beans::XPropertyChangeListener > & aListener) override;
+ virtual void SAL_CALL addVetoableChangeListener(const OUString& PropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener > & aListener) override;
+ virtual void SAL_CALL removeVetoableChangeListener(const OUString& PropertyName,
+ const css::uno::Reference< css::beans::XVetoableChangeListener > & aListener) override;
+};
+
+class SdDocLinkTarget final : public ::cppu::WeakImplHelper< css::container::XNameAccess,
+ css::lang::XServiceInfo >
+{
+private:
+ SdXImpressDocument* mpModel;
+ sal_uInt16 mnType;
+
+public:
+ SdDocLinkTarget( SdXImpressDocument* pModel, sal_uInt16 nT );
+
+ // css::container::XNameAccess
+ virtual css::uno::Any SAL_CALL getByName(const OUString& aName) override;
+ virtual css::uno::Sequence< OUString> SAL_CALL getElementNames() override;
+ virtual sal_Bool SAL_CALL hasByName(const OUString& aName) override;
+
+ // css::container::XElementAccess
+ virtual css::uno::Type SAL_CALL getElementType() override;
+ virtual sal_Bool SAL_CALL hasElements() override;
+
+ // css::lang::XServiceInfo
+ virtual OUString SAL_CALL getImplementationName() override;
+ virtual sal_Bool SAL_CALL supportsService(const OUString& ServiceName) override;
+ virtual css::uno::Sequence< OUString> SAL_CALL getSupportedServiceNames() override;
// internal
/// @throws std::exception
diff --git a/sd/source/ui/unoidl/unomodel.cxx b/sd/source/ui/unoidl/unomodel.cxx
index 9e9845c3c3cd..3350da8b92e5 100644
--- a/sd/source/ui/unoidl/unomodel.cxx
+++ b/sd/source/ui/unoidl/unomodel.cxx
@@ -139,6 +139,14 @@ using namespace ::cppu;
using namespace ::com::sun::star;
using namespace ::sd;
+const TranslateId aTypeResIds[SdLinkTargetType::Count] =
+{
+ STR_SD_PAGE, // SdLinkTargetType::Page
+ STR_NOTES_MODE, // SdLinkTargetType::Notes
+ STR_HANDOUT, // SdLinkTargetType::Handout
+ STR_MASTERPAGE_NAME, // SdLinkTargetType::MasterPage
+};
+
TranslateId SdTPAction::GetClickActionSdResId( presentation::ClickAction eCA )
{
switch( eCA )
@@ -3386,6 +3394,8 @@ uno::Sequence< OUString > SAL_CALL SdMasterPagesAccess::getSupportedServiceNames
SdDocLinkTargets::SdDocLinkTargets( SdXImpressDocument& rMyModel ) noexcept
: mpModel( &rMyModel )
{
+ for (sal_uInt16 i=0; i < SdLinkTargetType::Count; i++)
+ aNames[i] = SdResId(aTypeResIds[i]);
}
SdDocLinkTargets::~SdDocLinkTargets() noexcept
@@ -3411,6 +3421,172 @@ void SAL_CALL SdDocLinkTargets::removeEventListener( const uno::Reference< lang:
// XNameAccess
uno::Any SAL_CALL SdDocLinkTargets::getByName( const OUString& aName )
{
+ if (mpModel)
+ {
+ for (sal_uInt16 i=0; i < SdLinkTargetType::Count; i++)
+ if ( aNames[i] == aName )
+ return uno::Any(uno::Reference< beans::XPropertySet >(new SdDocLinkTargetType( mpModel, i )));
+ }
+
+ throw container::NoSuchElementException();
+}
+
+uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getElementNames()
+{
+ uno::Sequence<OUString> aRet(SdLinkTargetType::Count);
+ OUString* pArray = aRet.getArray();
+ for (sal_uInt16 i=0; i < SdLinkTargetType::Count; i++)
+ pArray[i] = aNames[i];
+ return aRet;
+}
+
+sal_Bool SAL_CALL SdDocLinkTargets::hasByName( const OUString& aName )
+{
+ for (const auto & i : aNames)
+ if ( i == aName )
+ return true;
+ return false;
+}
+
+// container::XElementAccess
+uno::Type SAL_CALL SdDocLinkTargets::getElementType()
+{
+ return cppu::UnoType<beans::XPropertySet>::get();
+}
+
+sal_Bool SAL_CALL SdDocLinkTargets::hasElements()
+{
+ return true;
+}
+
+SdPage* SdDocLinkTarget::FindPage( std::u16string_view rName ) const
+{
+ SdDrawDocument* pDoc = mpModel->GetDoc();
+ if( pDoc == nullptr )
+ return nullptr;
+
+ const sal_uInt16 nMaxPages = pDoc->GetPageCount();
+ const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount();
+
+ sal_uInt16 nPage;
+ SdPage* pPage;
+
+ const bool bDraw = pDoc->GetDocumentType() == DocumentType::Draw;
+
+ // standard pages
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ {
+ pPage = static_cast<SdPage*>(pDoc->GetPage( nPage ));
+ if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) )
+ return pPage;
+ }
+
+ // master pages
+ for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
+ {
+ pPage = static_cast<SdPage*>(pDoc->GetMasterPage( nPage ));
+ if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) )
+ return pPage;
+ }
+
+ return nullptr;
+}
+
+// XServiceInfo
+OUString SAL_CALL SdDocLinkTargets::getImplementationName()
+{
+ return "SdDocLinkTargets";
+}
+
+sal_Bool SAL_CALL SdDocLinkTargets::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.LinkTargets" };
+}
+
+SdDocLinkTargetType::SdDocLinkTargetType(SdXImpressDocument* pModel, sal_uInt16 nT) noexcept
+ : mpModel(pModel)
+ , mnType(nT)
+{
+ maName = SdResId(aTypeResIds[nT]);
+}
+
+// beans::XPropertySet
+
+uno::Reference< beans::XPropertySetInfo > SAL_CALL SdDocLinkTargetType::getPropertySetInfo()
+{
+ static uno::Reference< beans::XPropertySetInfo > aRef;//(new SfxItemPropertySetInfo( lcl_GetLinkTargetMap() ));
+ return aRef;
+}
+
+void SAL_CALL SdDocLinkTargetType::setPropertyValue(const OUString& /* aPropertyName */,
+ const uno::Any& /* aValue */)
+{
+ // everything is read-only
+}
+
+uno::Any SAL_CALL SdDocLinkTargetType::getPropertyValue(const OUString& PropertyName)
+{
+ uno::Any aRet;
+ if ( PropertyName == "LinkDisplayName" )
+ aRet <<= maName;
+
+ return aRet;
+}
+
+void SAL_CALL SdDocLinkTargetType::addPropertyChangeListener( const OUString&,
+ const uno::Reference<beans::XPropertyChangeListener>&)
+{ OSL_FAIL("not implemented"); }
+
+void SAL_CALL SdDocLinkTargetType::removePropertyChangeListener( const OUString&,
+ const uno::Reference<beans::XPropertyChangeListener>&)
+{ OSL_FAIL("not implemented"); }
+
+void SAL_CALL SdDocLinkTargetType::addVetoableChangeListener( const OUString&,
+ const uno::Reference<beans::XVetoableChangeListener>&)
+{ OSL_FAIL("not implemented"); }
+
+void SAL_CALL SdDocLinkTargetType::removeVetoableChangeListener( const OUString&,
+ const uno::Reference<beans::XVetoableChangeListener>&)
+{ OSL_FAIL("not implemented"); }
+
+// document::XLinkTargetSupplier
+
+uno::Reference< container::XNameAccess > SAL_CALL SdDocLinkTargetType::getLinks()
+{
+ return new SdDocLinkTarget( mpModel, mnType );
+}
+
+// XServiceInfo
+OUString SAL_CALL SdDocLinkTargetType::getImplementationName()
+{
+ return "SdDocLinkTargetType";
+}
+
+sal_Bool SAL_CALL SdDocLinkTargetType::supportsService( const OUString& ServiceName )
+{
+ return cppu::supportsService( this, ServiceName );
+}
+
+uno::Sequence< OUString > SAL_CALL SdDocLinkTargetType::getSupportedServiceNames()
+{
+ return { "com.sun.star.document.LinkTargetSupplier" };
+}
+
+SdDocLinkTarget::SdDocLinkTarget( SdXImpressDocument* pModel, sal_uInt16 nT )
+ : mpModel(pModel)
+ , mnType(nT)
+{
+}
+
+// container::XNameAccess
+
+uno::Any SAL_CALL SdDocLinkTarget::getByName(const OUString& aName)
+{
::SolarMutexGuard aGuard;
if( nullptr == mpModel )
@@ -3430,7 +3606,7 @@ uno::Any SAL_CALL SdDocLinkTargets::getByName( const OUString& aName )
return aAny;
}
-uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getElementNames()
+uno::Sequence<OUString> SAL_CALL SdDocLinkTarget::getElementNames()
{
::SolarMutexGuard aGuard;
@@ -3448,40 +3624,78 @@ uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getElementNames()
const sal_uInt16 nMaxPages = pDoc->GetSdPageCount( PageKind::Standard );
const sal_uInt16 nMaxMasterPages = pDoc->GetMasterSdPageCount( PageKind::Standard );
- uno::Sequence< OUString > aSeq( nMaxPages + nMaxMasterPages );
+ uno::Sequence< OUString > aSeq( mnType == SdLinkTargetType::Page ? nMaxPages : nMaxMasterPages );
OUString* pStr = aSeq.getArray();
sal_uInt16 nPage;
- // standard pages
- for( nPage = 0; nPage < nMaxPages; nPage++ )
- *pStr++ = pDoc->GetSdPage( nPage, PageKind::Standard )->GetName();
-
- // master pages
- for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
- *pStr++ = pDoc->GetMasterSdPage( nPage, PageKind::Standard )->GetName();
+ if (mnType == SdLinkTargetType::Page)
+ {
+ // standard pages
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ *pStr++ = pDoc->GetSdPage( nPage, PageKind::Standard )->GetName();
+ }
+ else
+ {
+ // master pages
+ for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
+ *pStr++ = pDoc->GetMasterSdPage( nPage, PageKind::Standard )->GetName();
+ }
return aSeq;
}
else
{
- const sal_uInt16 nMaxPages = pDoc->GetPageCount();
+ PageKind eKind;
+ switch (mnType)
+ {
+ case SdLinkTargetType::Notes:
+ eKind = PageKind::Notes;
+ break;
+ case SdLinkTargetType::Handout:
+ eKind = PageKind::Handout;
+ break;
+ default:
+ eKind = PageKind::Standard;
+ break;
+ }
+ const sal_uInt16 nMaxPages = pDoc->GetSdPageCount( eKind );
const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount();
- uno::Sequence< OUString > aSeq( nMaxPages + nMaxMasterPages );
+ uno::Sequence< OUString > aSeq( mnType == SdLinkTargetType::MasterPage ? nMaxMasterPages : nMaxPages );
OUString* pStr = aSeq.getArray();
sal_uInt16 nPage;
- // standard pages
- for( nPage = 0; nPage < nMaxPages; nPage++ )
- *pStr++ = static_cast<SdPage*>(pDoc->GetPage( nPage ))->GetName();
-
- // master pages
- for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
- *pStr++ = static_cast<SdPage*>(pDoc->GetMasterPage( nPage ))->GetName();
+ switch (mnType)
+ {
+ case SdLinkTargetType::Page:
+ {
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ *pStr++ = pDoc->GetSdPage( nPage, PageKind::Standard )->GetName();
+ break;
+ }
+ case SdLinkTargetType::Notes:
+ {
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ *pStr++ = pDoc->GetSdPage( nPage, PageKind::Notes )->GetName();
+ break;
+ }
+ case SdLinkTargetType::Handout:
+ {
+ for( nPage = 0; nPage < nMaxPages; nPage++ )
+ *pStr++ = pDoc->GetSdPage( nPage, PageKind::Handout )->GetName();
+ break;
+ }
+ case SdLinkTargetType::MasterPage:
+ {
+ for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
+ *pStr++ = static_cast<SdPage*>(pDoc->GetMasterPage( nPage ))->GetName();
+ break;
+ }
+ }
return aSeq;
}
}
-sal_Bool SAL_CALL SdDocLinkTargets::hasByName( const OUString& aName )
+sal_Bool SAL_CALL SdDocLinkTarget::hasByName(const OUString& aName)
{
::SolarMutexGuard aGuard;
@@ -3492,12 +3706,13 @@ sal_Bool SAL_CALL SdDocLinkTargets::hasByName( const OUString& aName )
}
// container::XElementAccess
-uno::Type SAL_CALL SdDocLinkTargets::getElementType()
+
+uno::Type SAL_CALL SdDocLinkTarget::getElementType()
{
return cppu::UnoType<beans::XPropertySet>::get();
}
-sal_Bool SAL_CALL SdDocLinkTargets::hasElements()
+sal_Bool SAL_CALL SdDocLinkTarget::hasElements()
{
::SolarMutexGuard aGuard;
@@ -3507,51 +3722,18 @@ sal_Bool SAL_CALL SdDocLinkTargets::hasElements()
return mpModel->GetDoc() != nullptr;
}
-SdPage* SdDocLinkTargets::FindPage( std::u16string_view rName ) const
-{
- SdDrawDocument* pDoc = mpModel->GetDoc();
- if( pDoc == nullptr )
- return nullptr;
-
- const sal_uInt16 nMaxPages = pDoc->GetPageCount();
- const sal_uInt16 nMaxMasterPages = pDoc->GetMasterPageCount();
-
- sal_uInt16 nPage;
- SdPage* pPage;
-
- const bool bDraw = pDoc->GetDocumentType() == DocumentType::Draw;
-
- // standard pages
- for( nPage = 0; nPage < nMaxPages; nPage++ )
- {
- pPage = static_cast<SdPage*>(pDoc->GetPage( nPage ));
- if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) )
- return pPage;
- }
-
- // master pages
- for( nPage = 0; nPage < nMaxMasterPages; nPage++ )
- {
- pPage = static_cast<SdPage*>(pDoc->GetMasterPage( nPage ));
- if( (pPage->GetName() == rName) && (!bDraw || (pPage->GetPageKind() == PageKind::Standard)) )
- return pPage;
- }
-
- return nullptr;
-}
-
// XServiceInfo
-OUString SAL_CALL SdDocLinkTargets::getImplementationName()
+OUString SAL_CALL SdDocLinkTarget::getImplementationName()
{
- return "SdDocLinkTargets";
+ return "SdDocLinkTarget";
}
-sal_Bool SAL_CALL SdDocLinkTargets::supportsService( const OUString& ServiceName )
+sal_Bool SAL_CALL SdDocLinkTarget::supportsService( const OUString& ServiceName )
{
return cppu::supportsService( this, ServiceName );
}
-uno::Sequence< OUString > SAL_CALL SdDocLinkTargets::getSupportedServiceNames()
+uno::Sequence< OUString > SAL_CALL SdDocLinkTarget::getSupportedServiceNames()
{
return { "com.sun.star.document.LinkTargets" };
}