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 .
21 #include "ConfigurationClassifier.hxx"
23 #include "framework/FrameworkHelper.hxx"
25 using namespace ::com::sun::star
;
26 using namespace ::com::sun::star::uno
;
27 using namespace ::com::sun::star::drawing::framework
;
29 namespace sd
{ namespace framework
{
31 ConfigurationClassifier::ConfigurationClassifier (
32 const Reference
<XConfiguration
>& rxConfiguration1
,
33 const Reference
<XConfiguration
>& rxConfiguration2
)
34 : mxConfiguration1(rxConfiguration1
),
35 mxConfiguration2(rxConfiguration2
),
45 bool ConfigurationClassifier::Partition (void)
52 mxConfiguration1
->getResources(NULL
, OUString(), AnchorBindingMode_DIRECT
),
53 mxConfiguration2
->getResources(NULL
, OUString(), AnchorBindingMode_DIRECT
));
55 return !maC1minusC2
.empty() || !maC2minusC1
.empty();
61 const ConfigurationClassifier::ResourceIdVector
& ConfigurationClassifier::GetC1minusC2 (void) const
69 const ConfigurationClassifier::ResourceIdVector
& ConfigurationClassifier::GetC2minusC1 (void) const
76 const ConfigurationClassifier::ResourceIdVector
& ConfigurationClassifier::GetC1andC2 (void) const
82 void ConfigurationClassifier::PartitionResources (
83 const ::com::sun::star::uno::Sequence
<Reference
<XResourceId
> >& rS1
,
84 const ::com::sun::star::uno::Sequence
<Reference
<XResourceId
> >& rS2
)
86 ResourceIdVector aC1minusC2
;
87 ResourceIdVector aC2minusC1
;
88 ResourceIdVector aC1andC2
;
90 // Classify the resources in the configurations that are not bound to
99 SAL_INFO("sd.fwk", OSL_THIS_FUNC
<< ": copying resource ids to C1-C2");
100 CopyResources(aC1minusC2
, mxConfiguration1
, maC1minusC2
);
101 SAL_INFO("sd.fwk", OSL_THIS_FUNC
<< ": copying resource ids to C2-C1");
102 CopyResources(aC2minusC1
, mxConfiguration2
, maC2minusC1
);
104 // Process the unique resources that belong to both configurations.
105 ResourceIdVector::const_iterator iResource
;
106 for (iResource
=aC1andC2
.begin(); iResource
!=aC1andC2
.end(); ++iResource
)
108 maC1andC2
.push_back(*iResource
);
110 mxConfiguration1
->getResources(*iResource
, OUString(), AnchorBindingMode_DIRECT
),
111 mxConfiguration2
->getResources(*iResource
, OUString(), AnchorBindingMode_DIRECT
));
118 void ConfigurationClassifier::ClassifyResources (
119 const ::com::sun::star::uno::Sequence
<Reference
<XResourceId
> >& rS1
,
120 const ::com::sun::star::uno::Sequence
<Reference
<XResourceId
> >& rS2
,
121 ResourceIdVector
& rS1minusS2
,
122 ResourceIdVector
& rS2minusS1
,
123 ResourceIdVector
& rS1andS2
)
125 // Get arrays from the sequences for faster iteration.
126 const Reference
<XResourceId
>* aA1
= rS1
.getConstArray();
127 const Reference
<XResourceId
>* aA2
= rS2
.getConstArray();
128 sal_Int32
nL1 (rS1
.getLength());
129 sal_Int32
nL2 (rS2
.getLength());
131 // Find all elements in rS1 and place them in rS1minusS2 or rS1andS2
132 // depending on whether they are in rS2 or not.
133 for (sal_Int32 i
=0; i
<nL1
; ++i
)
136 for (sal_Int32 j
=0; j
<nL2
&& !bFound
; ++j
)
137 if (aA1
[i
]->getResourceURL().equals(aA2
[j
]->getResourceURL()))
141 rS1andS2
.push_back(aA1
[i
]);
143 rS1minusS2
.push_back(aA1
[i
]);
146 // Find all elements in rS2 that are not in rS1. The elements that are
147 // in both rS1 and rS2 have been handled above and are therefore ignored
149 for (sal_Int32 j
=0; j
<nL2
; ++j
)
152 for (sal_Int32 i
=0; i
<nL1
&& !bFound
; ++i
)
153 if (aA2
[j
]->getResourceURL().equals(aA1
[i
]->getResourceURL()))
157 rS2minusS1
.push_back(aA2
[j
]);
164 void ConfigurationClassifier::CopyResources (
165 const ResourceIdVector
& rSource
,
166 const Reference
<XConfiguration
>& rxConfiguration
,
167 ResourceIdVector
& rTarget
)
169 // Copy all resources bound to the ones in aC1minusC2Unique to rC1minusC2.
170 ResourceIdVector::const_iterator
iResource (rSource
.begin());
171 ResourceIdVector::const_iterator
iEnd(rSource
.end());
172 for ( ; iResource
!=iEnd
; ++iResource
)
174 const Sequence
<Reference
<XResourceId
> > aBoundResources (
175 rxConfiguration
->getResources(
178 AnchorBindingMode_INDIRECT
));
179 const sal_Int32
nL (aBoundResources
.getLength());
181 rTarget
.reserve(rTarget
.size() + 1 + nL
);
182 rTarget
.push_back(*iResource
);
184 SAL_INFO("sd.fwk", OSL_THIS_FUNC
<< ": copying " <<
185 OUStringToOString(FrameworkHelper::ResourceIdToString(*iResource
),
186 RTL_TEXTENCODING_UTF8
).getStr());
188 const Reference
<XResourceId
>* aA
= aBoundResources
.getConstArray();
189 for (sal_Int32 i
=0; i
<nL
; ++i
)
191 rTarget
.push_back(aA
[i
]);
192 SAL_INFO("sd.fwk", OSL_THIS_FUNC
<< ": copying " <<
193 OUStringToOString(FrameworkHelper::ResourceIdToString(aA
[i
]),
194 RTL_TEXTENCODING_UTF8
).getStr());
200 void ConfigurationClassifier::TraceResourceIdVector (
201 const sal_Char
* pMessage
,
202 const ResourceIdVector
& rResources
) const
205 SAL_INFO("sd.fwk", OSL_THIS_FUNC
<< ": " << pMessage
);
206 ResourceIdVector::const_iterator iResource
;
207 for (iResource
=rResources
.begin(); iResource
!=rResources
.end(); ++iResource
)
209 OUString
sResource (FrameworkHelper::ResourceIdToString(*iResource
));
210 SAL_INFO("sd.fwk", OSL_THIS_FUNC
<< ": " <<
211 OUStringToOString(sResource
, RTL_TEXTENCODING_UTF8
).getStr());
216 } } // end of namespace sd::framework
218 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */