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"
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
),
41 bool ConfigurationClassifier::Partition()
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
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
);
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
)
105 for (sal_Int32 j
=0; j
<nL2
&& !bFound
; ++j
)
106 if (aA1
[i
]->getResourceURL().equals(aA2
[j
]->getResourceURL()))
110 rS1andS2
.push_back(aA1
[i
]);
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
118 for (sal_Int32 j
=0; j
<nL2
; ++j
)
121 for (sal_Int32 i
=0; i
<nL1
&& !bFound
; ++i
)
122 if (aA2
[j
]->getResourceURL().equals(aA1
[i
]->getResourceURL()))
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(
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: */