Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
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/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
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 .
18 : */
19 :
20 :
21 : #include "svx/DescriptionGenerator.hxx"
22 : #include <com/sun/star/beans/PropertyState.hpp>
23 : #include <com/sun/star/beans/XPropertySet.hpp>
24 : #include <com/sun/star/beans/XPropertyState.hpp>
25 : #include <com/sun/star/container/XChild.hpp>
26 : #include <com/sun/star/container/XNameContainer.hpp>
27 : #include <com/sun/star/container/XNameAccess.hpp>
28 : #include <com/sun/star/container/XNamed.hpp>
29 : #include <com/sun/star/drawing/FillStyle.hpp>
30 : #include <com/sun/star/drawing/XShapes.hpp>
31 : #include <com/sun/star/drawing/XShapeDescriptor.hpp>
32 : #include <com/sun/star/lang/IndexOutOfBoundsException.hpp>
33 : #include <com/sun/star/lang/XMultiServiceFactory.hpp>
34 : #include <com/sun/star/style/XStyle.hpp>
35 : #include <comphelper/processfactory.hxx>
36 : #include <osl/mutex.hxx>
37 : #include <vcl/svapp.hxx>
38 :
39 : #include <com/sun/star/uno/Exception.hpp>
40 :
41 : // Includes for string resources.
42 : #include "accessibility.hrc"
43 : #include "svx/svdstr.hrc"
44 : #include <svx/dialmgr.hxx>
45 :
46 : #include <svx/xdef.hxx>
47 : #include "svx/unoapi.hxx"
48 : #include "lookupcolorname.hxx"
49 :
50 : using namespace ::com::sun::star;
51 :
52 :
53 : namespace accessibility {
54 :
55 :
56 0 : DescriptionGenerator::DescriptionGenerator (
57 : const uno::Reference<drawing::XShape>& xShape)
58 : : mxShape (xShape),
59 : mxSet (mxShape, uno::UNO_QUERY),
60 0 : mbIsFirstProperty (true)
61 : {
62 0 : }
63 :
64 :
65 :
66 :
67 0 : DescriptionGenerator::~DescriptionGenerator()
68 : {
69 0 : }
70 :
71 :
72 :
73 :
74 0 : void DescriptionGenerator::Initialize (sal_Int32 nResourceId)
75 : {
76 : // Get the string from the resource for the specified id.
77 0 : OUString sPrefix;
78 : {
79 0 : SolarMutexGuard aGuard;
80 0 : sPrefix = OUString (SVX_RESSTR (nResourceId));
81 : }
82 :
83 : // Forward the call with the resulting string.
84 0 : Initialize (sPrefix);
85 0 : }
86 :
87 :
88 :
89 :
90 0 : void DescriptionGenerator::Initialize (const OUString& sPrefix)
91 : {
92 0 : msDescription = sPrefix;
93 0 : if (mxSet.is())
94 : {
95 : {
96 0 : SolarMutexGuard aGuard;
97 :
98 0 : msDescription.append(' ');
99 0 : msDescription.append(OUString (SVX_RESSTR(RID_SVXSTR_A11Y_WITH)));
100 0 : msDescription.append(' ');
101 :
102 0 : msDescription.append(OUString (SVX_RESSTR (RID_SVXSTR_A11Y_STYLE)));
103 0 : msDescription.append('=');
104 : }
105 :
106 : try
107 : {
108 0 : if (mxSet.is())
109 : {
110 0 : uno::Any aValue = mxSet->getPropertyValue ("Style");
111 0 : uno::Reference<container::XNamed> xStyle (aValue, uno::UNO_QUERY);
112 0 : if (xStyle.is())
113 0 : msDescription.append (xStyle->getName());
114 : }
115 : else
116 0 : msDescription.append ("<no style>");
117 : }
118 0 : catch (const ::com::sun::star::beans::UnknownPropertyException &)
119 : {
120 0 : msDescription.append ("<unknown>");
121 : }
122 : }
123 0 : }
124 :
125 :
126 :
127 :
128 0 : OUString DescriptionGenerator::operator() (void)
129 : {
130 0 : msDescription.append('.');
131 0 : return msDescription.makeStringAndClear();
132 : }
133 :
134 :
135 :
136 :
137 0 : void DescriptionGenerator::AddProperty (
138 : const OUString& sPropertyName,
139 : PropertyType aType,
140 : const sal_Int32 nLocalizedNameId,
141 : long nWhichId)
142 : {
143 0 : OUString sLocalizedName;
144 : {
145 0 : SolarMutexGuard aGuard;
146 0 : sLocalizedName = SVX_RESSTR (nLocalizedNameId);
147 : }
148 0 : AddProperty (sPropertyName, aType, sLocalizedName, nWhichId);
149 0 : }
150 :
151 :
152 :
153 :
154 0 : void DescriptionGenerator::AddProperty (const OUString& sPropertyName,
155 : PropertyType aType, const OUString& sLocalizedName, long nWhichId)
156 : {
157 0 : uno::Reference<beans::XPropertyState> xState (mxShape, uno::UNO_QUERY);
158 0 : if (xState.is()
159 0 : && xState->getPropertyState(sPropertyName)!=beans::PropertyState_DEFAULT_VALUE)
160 0 : if (mxSet.is())
161 : {
162 : // Append a separator from previous Properties.
163 0 : if ( ! mbIsFirstProperty)
164 0 : msDescription.append(',');
165 : else
166 : {
167 0 : SolarMutexGuard aGuard;
168 :
169 0 : msDescription.append(' ');
170 0 : msDescription.append(OUString (SVX_RESSTR(RID_SVXSTR_A11Y_AND)));
171 0 : msDescription.append(' ');
172 0 : mbIsFirstProperty = false;
173 : }
174 :
175 : // Delegate to type specific property handling.
176 0 : switch (aType)
177 : {
178 : case COLOR:
179 0 : AddColor (sPropertyName, sLocalizedName);
180 0 : break;
181 : case INTEGER:
182 0 : AddInteger (sPropertyName, sLocalizedName);
183 0 : break;
184 : case STRING:
185 0 : AddString (sPropertyName, sLocalizedName, nWhichId);
186 0 : break;
187 : case FILL_STYLE:
188 0 : AddFillStyle (sPropertyName, sLocalizedName);
189 0 : break;
190 : }
191 0 : }
192 0 : }
193 :
194 :
195 :
196 :
197 0 : void DescriptionGenerator::AppendString (const OUString& sString)
198 : {
199 0 : msDescription.append (sString);
200 0 : }
201 :
202 :
203 :
204 :
205 0 : void DescriptionGenerator::AddLineProperties()
206 : {
207 0 : AddProperty ("LineColor", DescriptionGenerator::COLOR, SIP_XA_LINECOLOR);
208 : AddProperty ("LineDashName", DescriptionGenerator::STRING,
209 0 : SIP_XA_LINEDASH, XATTR_LINEDASH);
210 0 : AddProperty ("LineWidth", DescriptionGenerator::INTEGER, SIP_XA_LINEWIDTH);
211 0 : }
212 :
213 :
214 :
215 :
216 : /** The fill style is described by the property "FillStyle". Depending on
217 : its value a hatch-, gradient-, or bitmap name is appended.
218 : */
219 0 : void DescriptionGenerator::AddFillProperties()
220 : {
221 0 : AddProperty ("FillStyle", DescriptionGenerator::FILL_STYLE, SIP_XA_FILLSTYLE);
222 0 : }
223 :
224 :
225 :
226 :
227 0 : void DescriptionGenerator::Add3DProperties()
228 : {
229 : AddProperty ("D3DMaterialColor", DescriptionGenerator::COLOR,
230 0 : RID_SVXSTR_A11Y_3D_MATERIAL_COLOR);
231 0 : AddLineProperties ();
232 0 : AddFillProperties ();
233 0 : }
234 :
235 :
236 :
237 :
238 0 : void DescriptionGenerator::AddTextProperties()
239 : {
240 0 : AddProperty ("CharColor", DescriptionGenerator::COLOR);
241 0 : AddFillProperties ();
242 0 : }
243 :
244 :
245 :
246 :
247 : /** Search for the given color in the global color table. If found append
248 : its name to the description. Otherwise append its RGB tuple.
249 : */
250 0 : void DescriptionGenerator::AddColor (const OUString& sPropertyName,
251 : const OUString& sLocalizedName)
252 : {
253 0 : msDescription.append(sLocalizedName);
254 0 : msDescription.append('=');
255 :
256 : try
257 : {
258 :
259 0 : long nValue(0);
260 0 : if (mxSet.is())
261 : {
262 0 : uno::Any aValue = mxSet->getPropertyValue (sPropertyName);
263 0 : aValue >>= nValue;
264 : }
265 :
266 0 : msDescription.append (lookUpColorName(nValue));
267 : }
268 0 : catch (const ::com::sun::star::beans::UnknownPropertyException &)
269 : {
270 0 : msDescription.append ("<unknown>");
271 : }
272 0 : }
273 :
274 :
275 :
276 :
277 0 : void DescriptionGenerator::AddInteger (const OUString& sPropertyName,
278 : const OUString& sLocalizedName)
279 : {
280 0 : msDescription.append(sLocalizedName);
281 0 : msDescription.append('=');
282 :
283 : try
284 : {
285 0 : if (mxSet.is())
286 : {
287 0 : uno::Any aValue = mxSet->getPropertyValue (sPropertyName);
288 0 : long nValue = 0;
289 0 : aValue >>= nValue;
290 0 : msDescription.append (nValue);
291 : }
292 : }
293 0 : catch (const ::com::sun::star::beans::UnknownPropertyException &)
294 : {
295 0 : msDescription.append ("<unknown>");
296 : }
297 0 : }
298 :
299 :
300 :
301 :
302 0 : void DescriptionGenerator::AddString (const OUString& sPropertyName,
303 : const OUString& sLocalizedName, long nWhichId)
304 : {
305 0 : msDescription.append(sLocalizedName);
306 0 : msDescription.append('=');
307 :
308 : try
309 : {
310 0 : if (mxSet.is())
311 : {
312 0 : uno::Any aValue = mxSet->getPropertyValue (sPropertyName);
313 0 : OUString sValue;
314 0 : aValue >>= sValue;
315 :
316 0 : if (nWhichId >= 0)
317 : {
318 0 : SolarMutexGuard aGuard;
319 : OUString sLocalizedValue =
320 0 : SvxUnogetInternalNameForItem(sal::static_int_cast<sal_Int16>(nWhichId),
321 0 : sValue);
322 0 : msDescription.append (sLocalizedValue);
323 : }
324 : else
325 0 : msDescription.append (sValue);
326 : }
327 : }
328 0 : catch (const ::com::sun::star::beans::UnknownPropertyException &)
329 : {
330 0 : msDescription.append ("<unknown>");
331 : }
332 0 : }
333 :
334 :
335 :
336 :
337 0 : void DescriptionGenerator::AddFillStyle (const OUString& sPropertyName,
338 : const OUString& sLocalizedName)
339 : {
340 0 : msDescription.append(sLocalizedName);
341 0 : msDescription.append('=');
342 :
343 : try
344 : {
345 0 : if (mxSet.is())
346 : {
347 0 : uno::Any aValue = mxSet->getPropertyValue (sPropertyName);
348 : drawing::FillStyle aFillStyle;
349 0 : aValue >>= aFillStyle;
350 :
351 : // Get the fill style name from the resource.
352 0 : OUString sFillStyleName;
353 : {
354 0 : SolarMutexGuard aGuard;
355 0 : switch (aFillStyle)
356 : {
357 : case drawing::FillStyle_NONE:
358 0 : sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_NONE);
359 0 : break;
360 : case drawing::FillStyle_SOLID:
361 0 : sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_SOLID);
362 0 : break;
363 : case drawing::FillStyle_GRADIENT:
364 0 : sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_GRADIENT);
365 0 : break;
366 : case drawing::FillStyle_HATCH:
367 0 : sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_HATCH);
368 0 : break;
369 : case drawing::FillStyle_BITMAP:
370 0 : sFillStyleName = SVX_RESSTR(RID_SVXSTR_A11Y_FILLSTYLE_BITMAP);
371 0 : break;
372 : case drawing::FillStyle_MAKE_FIXED_SIZE:
373 0 : break;
374 0 : }
375 : }
376 0 : msDescription.append (sFillStyleName);
377 :
378 : // Append the appropriate properties.
379 0 : switch (aFillStyle)
380 : {
381 : case drawing::FillStyle_NONE:
382 0 : break;
383 : case drawing::FillStyle_SOLID:
384 0 : AddProperty ("FillColor", COLOR, SIP_XA_FILLCOLOR);
385 0 : break;
386 : case drawing::FillStyle_GRADIENT:
387 : AddProperty ("FillGradientName", STRING, SIP_XA_FILLGRADIENT,
388 0 : XATTR_FILLGRADIENT);
389 0 : break;
390 : case drawing::FillStyle_HATCH:
391 0 : AddProperty ("FillColor", COLOR, SIP_XA_FILLCOLOR);
392 : AddProperty ("FillHatchName", STRING, SIP_XA_FILLHATCH,
393 0 : XATTR_FILLHATCH);
394 0 : break;
395 : case drawing::FillStyle_BITMAP:
396 : AddProperty ("FillBitmapName", STRING, SIP_XA_FILLBITMAP,
397 0 : XATTR_FILLBITMAP);
398 0 : break;
399 : case drawing::FillStyle_MAKE_FIXED_SIZE:
400 0 : break;
401 0 : }
402 : }
403 : }
404 0 : catch (const ::com::sun::star::beans::UnknownPropertyException &)
405 : {
406 0 : msDescription.append ("<unknown>");
407 : }
408 0 : }
409 :
410 : } // end of namespace accessibility
411 :
412 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|