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