bump product version to 4.1.6.2
[LibreOffice.git] / sd / source / ui / framework / configuration / ConfigurationClassifier.cxx
blobb8c0d757ee6cfa92e332adce4eedaa04084102a6
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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),
36 maC1minusC2(),
37 maC2minusC1(),
38 maC1andC2()
45 bool ConfigurationClassifier::Partition (void)
47 maC1minusC2.clear();
48 maC2minusC1.clear();
49 maC1andC2.clear();
51 PartitionResources(
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
63 return maC1minusC2;
69 const ConfigurationClassifier::ResourceIdVector& ConfigurationClassifier::GetC2minusC1 (void) const
71 return maC2minusC1;
76 const ConfigurationClassifier::ResourceIdVector& ConfigurationClassifier::GetC1andC2 (void) const
78 return maC1andC2;
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
91 // other resources.
92 ClassifyResources(
93 rS1,
94 rS2,
95 aC1minusC2,
96 aC2minusC1,
97 aC1andC2);
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);
109 PartitionResources(
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)
135 bool bFound (false);
136 for (sal_Int32 j=0; j<nL2 && !bFound; ++j)
137 if (aA1[i]->getResourceURL().equals(aA2[j]->getResourceURL()))
138 bFound = true;
140 if (bFound)
141 rS1andS2.push_back(aA1[i]);
142 else
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
148 // here.
149 for (sal_Int32 j=0; j<nL2; ++j)
151 bool bFound (false);
152 for (sal_Int32 i=0; i<nL1 && !bFound; ++i)
153 if (aA2[j]->getResourceURL().equals(aA1[i]->getResourceURL()))
154 bFound = true;
156 if ( ! bFound)
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(
176 *iResource,
177 OUString(),
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: */