22#include <com/sun/star/util/URLTransformer.hpp>
43#define USE_OPTIMIZATIONS
57 std::vector<OUString>&& rResourceURLs)
58 : maResourceURLs(
std::move(rResourceURLs))
64 const OUString& rsResourceURL)
65 : maResourceURLs(1, rsResourceURL)
68 if (rsResourceURL.isEmpty())
74 const OUString& rsResourceURL,
75 const OUString& rsAnchorURL)
84 const OUString& rsResourceURL,
85 const OUString& rsFirstAnchorURL,
86 const Sequence<OUString>& rAnchorURLs)
87 : maResourceURLs(2+rAnchorURLs.
getLength())
91 std::copy(rAnchorURLs.begin(), rAnchorURLs.end(), std::next(
maResourceURLs.begin(), 2));
112 if (
mpURL !=
nullptr)
118 mpURL.reset(
new util::URL);
120 xURLTransformer->parseStrict(*
mpURL);
136Reference<XResourceId> SAL_CALL
141 if (nAnchorCount > 0)
143 rResourceId->maResourceURLs.resize(nAnchorCount);
150Sequence<OUString> SAL_CALL
154 if (nAnchorCount > 0)
156 Sequence<OUString> aAnchorURLs (nAnchorCount);
157 std::copy_n(
maResourceURLs.begin() + 1, nAnchorCount, aAnchorURLs.getArray());
161 return Sequence<OUString>();
173 sal_Int32 nPrefixEnd (rsResourceURL.indexOf(
'/'));
175 nPrefixEnd = rsResourceURL.indexOf(
'/', nPrefixEnd+1) + 1;
179 return rsResourceURL.copy(0,nPrefixEnd);
188 sal_Int16 nResult (0);
190 if ( ! rxResourceId.is())
201#ifdef USE_OPTIMIZATIONS
202 pId =
dynamic_cast<ResourceId*
>(rxResourceId.get());
223 sal_Int16 nResult (0);
229 for (sal_Int32
nIndex=nURLCount-1,nLocalIndex=nLocalURLCount-1;
230 nIndex>=0 && nLocalIndex>=0;
235 const sal_Int32 nLocalResult (sURL.compareTo(sLocalURL));
236 if (nLocalResult != 0)
238 if (nLocalResult < 0)
251 if (nLocalURLCount != nURLCount)
253 if (nLocalURLCount < nURLCount)
265 sal_Int16 nResult (0);
267 const Sequence<OUString> aAnchorURLs (rxId->getAnchorURLs());
269 const sal_uInt32 nURLCount(1+aAnchorURLs.getLength());
272 sal_Int32 nLocalResult (0);
273 for (sal_Int32
nIndex=nURLCount-1,nLocalIndex=nLocalURLCount-1;
274 nIndex>=0&&nLocalIndex>=0;
281 if (nLocalResult != 0)
283 if (nLocalResult < 0)
296 if (nLocalURLCount != nURLCount)
298 if (nLocalURLCount < nURLCount)
310 const Reference<XResourceId>& rxResourceId,
311 AnchorBindingMode eMode)
313 if ( ! rxResourceId.is())
320#ifdef USE_OPTIMIZATIONS
321 pId =
dynamic_cast<ResourceId*
>(rxResourceId.get());
329 const OUString sResourceURL (rxResourceId->getResourceURL());
330 const Sequence<OUString> aAnchorURLs (rxResourceId->getAnchorURLs());
337 const OUString& rsAnchorURL,
338 AnchorBindingMode eMode)
343Reference<XResourceId> SAL_CALL
355 OUString sResourceURL;
356 if (rArgument >>= sResourceURL)
360 Reference<XResourceId> xAnchor;
361 if (rArgument >>= xAnchor)
366 const Sequence<OUString> aAnchorURLs (xAnchor->getAnchorURLs());
377 return "com.sun.star.comp.Draw.framework.ResourceId";
387 return {
"com.sun.star.drawing.framework.ResourceId"};
396 const OUString* psFirstAnchorURL,
397 const Sequence<OUString>* paAnchorURLs,
398 AnchorBindingMode eMode)
const
400 const sal_uInt32 nLocalAnchorURLCount (
maResourceURLs.size() - 1);
401 const bool bHasFirstAnchorURL (psFirstAnchorURL!=
nullptr);
402 const sal_uInt32 nAnchorURLCount ((bHasFirstAnchorURL?1:0)
403 + (paAnchorURLs!=
nullptr ? paAnchorURLs->getLength() : 0));
406 if (nLocalAnchorURLCount<nAnchorURLCount ||
407 (eMode==AnchorBindingMode_DIRECT && nLocalAnchorURLCount!=nAnchorURLCount))
414 sal_uInt32 nOffset = 0;
415 if (paAnchorURLs !=
nullptr)
417 sal_uInt32
nCount = paAnchorURLs->getLength();
418 while (nOffset < nCount)
421 (*paAnchorURLs)[nCount - 1 - nOffset] )
428 if (bHasFirstAnchorURL)
430 if ( *psFirstAnchorURL !=
maResourceURLs[nLocalAnchorURLCount - nOffset] )
438 const ::std::vector<OUString>& rAnchorURLs,
439 AnchorBindingMode eMode)
const
441 const sal_uInt32 nLocalAnchorURLCount (
maResourceURLs.size() - 1);
442 const sal_uInt32 nAnchorURLCount (rAnchorURLs.size());
445 if (nLocalAnchorURLCount<nAnchorURLCount ||
446 (eMode==AnchorBindingMode_DIRECT && nLocalAnchorURLCount!=nAnchorURLCount))
453 for (sal_uInt32 nOffset=0; nOffset<nAnchorURLCount; ++nOffset)
456 rAnchorURLs[nAnchorURLCount - 1 - nOffset] )
467 ::osl::Guard< ::osl::Mutex > aGuard (::osl::Mutex::getGlobalMutex());
469 if ( ! xURLTransformer.is())
472 Reference<uno::XComponentContext> xContext(::comphelper::getProcessComponentContext());
473 xURLTransformer.set(util::URLTransformer::create(xContext));
476 Reference<XInterface>(xURLTransformer,UNO_QUERY));
481 mpURL.reset(
new util::URL);
483 xURLTransformer->parseStrict(*
mpURL);
494extern "C" SAL_DLLPUBLIC_EXPORT css::uno::XInterface*
496 css::uno::Sequence<css::uno::Any>
const &)
SAL_DLLPUBLIC_EXPORT css::uno::XInterface * com_sun_star_comp_Draw_framework_ResourceID_get_implementation(css::uno::XComponentContext *, css::uno::Sequence< css::uno::Any > const &)
void AddResource(::std::unique_ptr< SdGlobalResource > pResource)
Add a resource to the container.
static SdGlobalResourceContainer & Instance()
Implementation of the css::drawing::framework::ResourceId service and the css::drawing::framework::XR...
bool IsBoundToAnchor(const OUString *psFirstAnchorURL, const css::uno::Sequence< OUString > *paAnchorURLs, css::drawing::framework::AnchorBindingMode eMode) const
Return whether the called ResourceId object is bound to the anchor consisting of the URLs given by ps...
virtual css::uno::Reference< css::drawing::framework::XResourceId > SAL_CALL clone() override
css::uno::Sequence< OUString > SAL_CALL getSupportedServiceNames() override
virtual css::util::URL SAL_CALL getFullResourceURL() override
virtual css::uno::Sequence< OUString > SAL_CALL getAnchorURLs() override
virtual css::uno::Reference< css::drawing::framework::XResourceId > SAL_CALL getAnchor() override
std::unique_ptr< css::util::URL > mpURL
ResourceId()
Create a new, empty resource id.
virtual sal_Int16 SAL_CALL compareTo(const css::uno::Reference< css::drawing::framework::XResourceId > &rxResourceId) override
virtual OUString SAL_CALL getResourceTypePrefix() override
sal_Int16 CompareToExternalImplementation(const css::uno::Reference< css::drawing::framework::XResourceId > &rxId) const
Compare the called ResourceId object to the given XResourceId object reference.
virtual sal_Bool SAL_CALL hasAnchor() override
virtual ~ResourceId() override
sal_Bool SAL_CALL supportsService(OUString const &ServiceName) override
virtual OUString SAL_CALL getResourceURL() override
std::vector< OUString > maResourceURLs
The set of URLs that consist of the resource URL at index 0 and the anchor URLs and indices 1 and abo...
OUString SAL_CALL getImplementationName() override
static css::uno::WeakReference< css::util::XURLTransformer > mxURLTransformerWeak
sal_Int16 CompareToLocalImplementation(const ResourceId &rId) const
Compare the called ResourceId object to the given ResourceId object.
virtual sal_Bool SAL_CALL isBoundToURL(const OUString &rsAnchorURL, css::drawing::framework::AnchorBindingMode eMode) override
virtual sal_Bool SAL_CALL isBoundTo(const css::uno::Reference< css::drawing::framework::XResourceId > &rxResourceId, css::drawing::framework::AnchorBindingMode eMode) override
void SAL_CALL initialize(const css::uno::Sequence< css::uno::Any > &aArguments) override
Sequence< PropertyValue > aArguments
double getLength(const B2DPolygon &rCandidate)
bool CPPUHELPER_DLLPUBLIC supportsService(css::lang::XServiceInfo *implementation, rtl::OUString const &name)