bump product version to 5.0.4.1
[LibreOffice.git] / sd / source / ui / framework / configuration / ConfigurationClassifier.cxx
blob05d1c9589e8510ad2e258e7a119f5a16d37bfdf5
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 .
20 #include "ConfigurationClassifier.hxx"
22 #include "framework/FrameworkHelper.hxx"
24 using namespace ::com::sun::star;
25 using namespace ::com::sun::star::uno;
26 using namespace ::com::sun::star::drawing::framework;
28 namespace sd { namespace framework {
30 ConfigurationClassifier::ConfigurationClassifier (
31 const Reference<XConfiguration>& rxConfiguration1,
32 const Reference<XConfiguration>& rxConfiguration2)
33 : mxConfiguration1(rxConfiguration1),
34 mxConfiguration2(rxConfiguration2),
35 maC1minusC2(),
36 maC2minusC1(),
37 maC1andC2()
41 bool ConfigurationClassifier::Partition()
43 maC1minusC2.clear();
44 maC2minusC1.clear();
45 maC1andC2.clear();
47 PartitionResources(
48 mxConfiguration1->getResources(NULL, OUString(), AnchorBindingMode_DIRECT),
49 mxConfiguration2->getResources(NULL, OUString(), AnchorBindingMode_DIRECT));
51 return !maC1minusC2.empty() || !maC2minusC1.empty();
54 void ConfigurationClassifier::PartitionResources (
55 const ::com::sun::star::uno::Sequence<Reference<XResourceId> >& rS1,
56 const ::com::sun::star::uno::Sequence<Reference<XResourceId> >& rS2)
58 ResourceIdVector aC1minusC2;
59 ResourceIdVector aC2minusC1;
60 ResourceIdVector aC1andC2;
62 // Classify the resources in the configurations that are not bound to
63 // other resources.
64 ClassifyResources(
65 rS1,
66 rS2,
67 aC1minusC2,
68 aC2minusC1,
69 aC1andC2);
71 SAL_INFO("sd.fwk", OSL_THIS_FUNC << ": copying resource ids to C1-C2");
72 CopyResources(aC1minusC2, mxConfiguration1, maC1minusC2);
73 SAL_INFO("sd.fwk", OSL_THIS_FUNC << ": copying resource ids to C2-C1");
74 CopyResources(aC2minusC1, mxConfiguration2, maC2minusC1);
76 // Process the unique resources that belong to both configurations.
77 ResourceIdVector::const_iterator iResource;
78 for (iResource=aC1andC2.begin(); iResource!=aC1andC2.end(); ++iResource)
80 maC1andC2.push_back(*iResource);
81 PartitionResources(
82 mxConfiguration1->getResources(*iResource, OUString(), AnchorBindingMode_DIRECT),
83 mxConfiguration2->getResources(*iResource, OUString(), AnchorBindingMode_DIRECT));
87 void ConfigurationClassifier::ClassifyResources (
88 const ::com::sun::star::uno::Sequence<Reference<XResourceId> >& rS1,
89 const ::com::sun::star::uno::Sequence<Reference<XResourceId> >& rS2,
90 ResourceIdVector& rS1minusS2,
91 ResourceIdVector& rS2minusS1,
92 ResourceIdVector& rS1andS2)
94 // Get arrays from the sequences for faster iteration.
95 const Reference<XResourceId>* aA1 = rS1.getConstArray();
96 const Reference<XResourceId>* aA2 = rS2.getConstArray();
97 sal_Int32 nL1 (rS1.getLength());
98 sal_Int32 nL2 (rS2.getLength());
100 // Find all elements in rS1 and place them in rS1minusS2 or rS1andS2
101 // depending on whether they are in rS2 or not.
102 for (sal_Int32 i=0; i<nL1; ++i)
104 bool bFound (false);
105 for (sal_Int32 j=0; j<nL2 && !bFound; ++j)
106 if (aA1[i]->getResourceURL().equals(aA2[j]->getResourceURL()))
107 bFound = true;
109 if (bFound)
110 rS1andS2.push_back(aA1[i]);
111 else
112 rS1minusS2.push_back(aA1[i]);
115 // Find all elements in rS2 that are not in rS1. The elements that are
116 // in both rS1 and rS2 have been handled above and are therefore ignored
117 // here.
118 for (sal_Int32 j=0; j<nL2; ++j)
120 bool bFound (false);
121 for (sal_Int32 i=0; i<nL1 && !bFound; ++i)
122 if (aA2[j]->getResourceURL().equals(aA1[i]->getResourceURL()))
123 bFound = true;
125 if ( ! bFound)
126 rS2minusS1.push_back(aA2[j]);
130 void ConfigurationClassifier::CopyResources (
131 const ResourceIdVector& rSource,
132 const Reference<XConfiguration>& rxConfiguration,
133 ResourceIdVector& rTarget)
135 // Copy all resources bound to the ones in aC1minusC2Unique to rC1minusC2.
136 ResourceIdVector::const_iterator iResource (rSource.begin());
137 ResourceIdVector::const_iterator iEnd(rSource.end());
138 for ( ; iResource!=iEnd; ++iResource)
140 const Sequence<Reference<XResourceId> > aBoundResources (
141 rxConfiguration->getResources(
142 *iResource,
143 OUString(),
144 AnchorBindingMode_INDIRECT));
145 const sal_Int32 nL (aBoundResources.getLength());
147 rTarget.reserve(rTarget.size() + 1 + nL);
148 rTarget.push_back(*iResource);
150 SAL_INFO("sd.fwk", OSL_THIS_FUNC << ": copying " <<
151 OUStringToOString(FrameworkHelper::ResourceIdToString(*iResource),
152 RTL_TEXTENCODING_UTF8).getStr());
154 const Reference<XResourceId>* aA = aBoundResources.getConstArray();
155 for (sal_Int32 i=0; i<nL; ++i)
157 rTarget.push_back(aA[i]);
158 SAL_INFO("sd.fwk", OSL_THIS_FUNC << ": copying " <<
159 OUStringToOString(FrameworkHelper::ResourceIdToString(aA[i]),
160 RTL_TEXTENCODING_UTF8).getStr());
165 void ConfigurationClassifier::TraceResourceIdVector (
166 const sal_Char* pMessage,
167 const ResourceIdVector& rResources)
170 SAL_INFO("sd.fwk", OSL_THIS_FUNC << ": " << pMessage);
171 ResourceIdVector::const_iterator iResource;
172 for (iResource=rResources.begin(); iResource!=rResources.end(); ++iResource)
174 OUString sResource (FrameworkHelper::ResourceIdToString(*iResource));
175 SAL_INFO("sd.fwk", OSL_THIS_FUNC << ": " <<
176 OUStringToOString(sResource, RTL_TEXTENCODING_UTF8).getStr());
180 } } // end of namespace sd::framework
182 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */