1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #include "ConfigurationClassifier.hxx"
22 #include <framework/FrameworkHelper.hxx>
23 #include <com/sun/star/drawing/framework/XConfiguration.hpp>
24 #include <sal/log.hxx>
26 using namespace ::com::sun::star
;
27 using namespace ::com::sun::star::uno
;
28 using namespace ::com::sun::star::drawing::framework
;
30 namespace sd::framework
{
32 ConfigurationClassifier::ConfigurationClassifier (
33 const Reference
<XConfiguration
>& rxConfiguration1
,
34 const Reference
<XConfiguration
>& rxConfiguration2
)
35 : mxConfiguration1(rxConfiguration1
),
36 mxConfiguration2(rxConfiguration2
)
40 bool ConfigurationClassifier::Partition()
46 mxConfiguration1
->getResources(nullptr, OUString(), AnchorBindingMode_DIRECT
),
47 mxConfiguration2
->getResources(nullptr, OUString(), AnchorBindingMode_DIRECT
));
49 return !maC1minusC2
.empty() || !maC2minusC1
.empty();
52 void ConfigurationClassifier::PartitionResources (
53 const css::uno::Sequence
<Reference
<XResourceId
> >& rS1
,
54 const css::uno::Sequence
<Reference
<XResourceId
> >& rS2
)
56 ResourceIdVector aC1minusC2
;
57 ResourceIdVector aC2minusC1
;
58 ResourceIdVector aC1andC2
;
60 // Classify the resources in the configurations that are not bound to
69 SAL_INFO("sd.fwk", __func__
<< ": copying resource ids to C1-C2");
70 CopyResources(aC1minusC2
, mxConfiguration1
, maC1minusC2
);
71 SAL_INFO("sd.fwk", __func__
<< ": copying resource ids to C2-C1");
72 CopyResources(aC2minusC1
, mxConfiguration2
, maC2minusC1
);
74 // Process the unique resources that belong to both configurations.
75 for (const auto& rxResource
: aC1andC2
)
78 mxConfiguration1
->getResources(rxResource
, OUString(), AnchorBindingMode_DIRECT
),
79 mxConfiguration2
->getResources(rxResource
, OUString(), AnchorBindingMode_DIRECT
));
83 void ConfigurationClassifier::ClassifyResources (
84 const css::uno::Sequence
<Reference
<XResourceId
> >& rS1
,
85 const css::uno::Sequence
<Reference
<XResourceId
> >& rS2
,
86 ResourceIdVector
& rS1minusS2
,
87 ResourceIdVector
& rS2minusS1
,
88 ResourceIdVector
& rS1andS2
)
90 // Find all elements in rS1 and place them in rS1minusS2 or rS1andS2
91 // depending on whether they are in rS2 or not.
92 for (const Reference
<XResourceId
>& rA1
: rS1
)
94 bool bFound
= std::any_of(rS2
.begin(), rS2
.end(),
95 [&rA1
](const Reference
<XResourceId
>& rA2
) {
96 return rA1
->getResourceURL() == rA2
->getResourceURL(); });
99 rS1andS2
.push_back(rA1
);
101 rS1minusS2
.push_back(rA1
);
104 // Find all elements in rS2 that are not in rS1. The elements that are
105 // in both rS1 and rS2 have been handled above and are therefore ignored
107 for (const Reference
<XResourceId
>& rA2
: rS2
)
109 bool bFound
= std::any_of(rS1
.begin(), rS1
.end(),
110 [&rA2
](const Reference
<XResourceId
>& rA1
) {
111 return rA2
->getResourceURL() == rA1
->getResourceURL(); });
114 rS2minusS1
.push_back(rA2
);
118 void ConfigurationClassifier::CopyResources (
119 const ResourceIdVector
& rSource
,
120 const Reference
<XConfiguration
>& rxConfiguration
,
121 ResourceIdVector
& rTarget
)
123 // Copy all resources bound to the ones in aC1minusC2Unique to rC1minusC2.
124 for (const auto& rxResource
: rSource
)
126 const Sequence
<Reference
<XResourceId
> > aBoundResources (
127 rxConfiguration
->getResources(
130 AnchorBindingMode_INDIRECT
));
131 const sal_Int32
nL (aBoundResources
.getLength());
133 rTarget
.reserve(rTarget
.size() + 1 + nL
);
134 rTarget
.push_back(rxResource
);
136 SAL_INFO("sd.fwk", __func__
<< ": copying " <<
137 FrameworkHelper::ResourceIdToString(rxResource
));
139 for (const Reference
<XResourceId
>& rBoundResource
: aBoundResources
)
141 rTarget
.push_back(rBoundResource
);
142 SAL_INFO("sd.fwk", __func__
<< ": copying " <<
143 FrameworkHelper::ResourceIdToString(rBoundResource
));
148 #if DEBUG_SD_CONFIGURATION_TRACE
150 void ConfigurationClassifier::TraceResourceIdVector (
151 const char* pMessage
,
152 const ResourceIdVector
& rResources
)
155 SAL_INFO("sd.fwk", __func__
<< ": " << pMessage
);
156 for (const auto& rxResource
: rResources
)
158 OUString
sResource (FrameworkHelper::ResourceIdToString(rxResource
));
159 SAL_INFO("sd.fwk", __func__
<< ": " << sResource
);
165 } // end of namespace sd::framework
167 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */