1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2000, 2010 Oracle and/or its affiliates.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * This file is part of OpenOffice.org.
11 * OpenOffice.org is free software: you can redistribute it and/or modify
12 * it under the terms of the GNU Lesser General Public License version 3
13 * only, as published by the Free Software Foundation.
15 * OpenOffice.org is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU Lesser General Public License version 3 for more details
19 * (a copy is included in the LICENSE file that accompanied this code).
21 * You should have received a copy of the GNU Lesser General Public License
22 * version 3 along with OpenOffice.org. If not, see
23 * <http://www.openoffice.org/license.html>
24 * for a copy of the LGPLv3 License.
26 ************************************************************************/
29 import com
.sun
.star
.beans
.PropertyValue
;
30 import com
.sun
.star
.beans
.UnknownPropertyException
;
31 import com
.sun
.star
.container
.XIndexReplace
;
32 import com
.sun
.star
.container
.XNameContainer
;
33 import com
.sun
.star
.lang
.WrappedTargetException
;
34 import com
.sun
.star
.uno
.AnyConverter
;
35 import com
.sun
.star
.uno
.Type
;
36 import com
.sun
.star
.xml
.AttributeData
;
37 import ifc
.text
._NumberingLevel
;
38 import java
.util
.Enumeration
;
39 import java
.util
.Hashtable
;
41 import lib
.MultiPropertyTest
;
43 import share
.LogWriter
;
50 * Testing <code>com.sun.star.style.ParagraphProperties</code>
51 * service properties :
53 * <li><code> ParaAdjust</code></li>
54 * <li><code> ParaLineSpacing</code></li>
55 * <li><code> ParaBackColor</code></li>
56 * <li><code> ParaBackTransparent</code></li>
57 * <li><code> ParaBackGraphicURL</code></li>
58 * <li><code> ParaBackGraphicFilter</code></li>
59 * <li><code> ParaBackGraphicLocation</code></li>
60 * <li><code> ParaLastLineAdjust</code></li>
61 * <li><code> ParaExpandSingleWord</code></li>
62 * <li><code> ParaLeftMargin</code></li>
63 * <li><code> ParaRightMargin</code></li>
64 * <li><code> ParaTopMargin</code></li>
65 * <li><code> ParaBottomMargin</code></li>
66 * <li><code> ParaLineNumberCount</code></li>
67 * <li><code> ParaLineNumberStartValue</code></li>
68 * <li><code> ParaIsHyphenation</code></li>
69 * <li><code> PageDescName</code></li>
70 * <li><code> PageNumberOffset</code></li>
71 * <li><code> ParaRegisterModeActive</code></li>
72 * <li><code> ParaTabStops</code></li>
73 * <li><code> ParaStyleName</code></li>
74 * <li><code> DropCapFormat</code></li>
75 * <li><code> DropCapWholeWord</code></li>
76 * <li><code> ParaKeepTogether</code></li>
77 * <li><code> ParaSplit</code></li>
78 * <li><code> NumberingLevel</code></li>
79 * <li><code> NumberingRules</code></li>
80 * <li><code> NumberingStartValue</code></li>
81 * <li><code> ParaIsNumberingRestart</code></li>
82 * <li><code> NumberingStyleName</code></li>
83 * <li><code> ParaOrphans</code></li>
84 * <li><code> ParaWidows</code></li>
85 * <li><code> ParaShadowFormat</code></li>
86 * <li><code> IsHangingPunctuation</code></li>
87 * <li><code> IsCharacterDistance</code></li>
88 * <li><code> IsForbiddenRules</code></li>
89 * <li><code> LeftBorder</code></li>
90 * <li><code> RightBorder</code></li>
91 * <li><code> TopBorder</code></li>
92 * <li><code> BottomBorder</code></li>
93 * <li><code> BorderDistance</code></li>
94 * <li><code> LeftBorderDistance</code></li>
95 * <li><code> RightBorderDistance</code></li>
96 * <li><code> TopBorderDistance</code></li>
97 * <li><code> BottomBorderDistance</code></li>
99 * This test needs the following object relations :
101 * <li> <code>'NRULES'</code> : <b>optional</b>
102 * (service <code>com.sun.star.text.NumberingRules</code>):
103 * instance of the service which can be set as 'NumberingRules'
104 * property new value. If the relation doesn't then two
105 * different <code>NumberingRules</code> objects are tried
106 * to be obtained by setting different 'NumberingStyleName'
107 * property styles and getting 'NumberingRules' property values.</li>
109 * Properties testing is automated by <code>lib.MultiPropertyTest</code>.
110 * @see com.sun.star.style.ParagraphProperties
112 public class _ParagraphProperties
extends MultiPropertyTest
{
114 * Custom tester for numbering style properties. Switches between
115 * 'Numbering 1' and 'Numbering 2' styles.
117 protected PropertyTester NumberingStyleTester
= new PropertyTester() {
118 protected Object
getNewValue(String propName
, Object oldValue
)
119 throws java
.lang
.IllegalArgumentException
{
120 if ((oldValue
!= null) && (oldValue
.equals("Numbering 1"))) {
121 return "Numbering 2";
123 return "Numbering 1";
129 * Custom tester for paragraph style properties. Switches between
130 * 'Salutation' and 'Heading' styles.
132 protected PropertyTester charStyleTester
= new PropertyTester() {
133 protected Object
getNewValue(String propName
, Object oldValue
) {
134 if (!utils
.isVoid(oldValue
) && (oldValue
.equals("Example"))) {
143 * Custom tester for paragraph style properties. Switches between
144 * 'Salutation' and 'Heading' styles.
146 protected PropertyTester ParaStyleTester
= new PropertyTester() {
147 protected Object
getNewValue(String propName
, Object oldValue
) {
148 if (!utils
.isVoid(oldValue
) && (oldValue
.equals("Heading"))) {
157 * Custom tester for PageDescName properties. Switches between
158 * 'HTML' and 'Standard' descriptor names.
160 protected PropertyTester PageDescTester
= new PropertyTester() {
161 protected Object
getNewValue(String propName
, Object oldValue
) {
162 if (!util
.utils
.isVoid(oldValue
) &&
163 (oldValue
.equals("Default"))) {
172 * Custom tester for properties which have <code>short</code> type
173 * and can be void, so if they have void value, the new value must
174 * be specified. Switches between two different values.
176 protected PropertyTester ShortTester
= new PropertyTester() {
177 protected Object
getNewValue(String propName
, Object oldValue
) {
178 if ((oldValue
!= null) &&
179 (oldValue
.equals(new Short((short) 0)))) {
180 return new Short((short) 2);
182 return new Short((short) 0);
188 * Custom tester for properties which have <code>boolean</code> type
189 * and can be void, so if they have void value, the new value must
190 * be specified. Switches between true and false.
192 protected PropertyTester BooleanTester
= new PropertyTester() {
193 protected Object
getNewValue(String propName
, Object oldValue
) {
194 if ((oldValue
!= null) &&
195 (oldValue
.equals(new Boolean((boolean) false)))) {
196 return new Boolean((boolean) true);
198 return new Boolean((boolean) false);
204 * Custom tester for properties which contains image URLs.
205 * Switches between two JPG images' URLs.
207 protected PropertyTester URLTester
= new PropertyTester() {
208 protected Object
getNewValue(String propName
, Object oldValue
) {
209 if (oldValue
.equals(util
.utils
.getFullTestURL("space-metal.jpg"))) {
210 return util
.utils
.getFullTestURL("crazy-blue.jpg");
212 return util
.utils
.getFullTestURL("space-metal.jpg");
217 protected PropertyTester rules
= null;
220 * Creates tester for 'NumberingRules' depending on relation.
222 public void before() {
223 final Object nRules
= tEnv
.getObjRelation("NRULES");
225 if (nRules
!= null) {
226 rules
= new PropertyTester() {
227 protected Object
getNewValue(String propName
, Object oldValue
) {
233 Object rules1
= null;
234 Object rules2
= null;
237 oObj
.setPropertyValue("NumberingStyleName", "Numbering 1");
238 rules1
= oObj
.getPropertyValue("NumberingRules");
239 oObj
.setPropertyValue("NumberingStyleName", "Numbering 2");
240 rules2
= oObj
.getPropertyValue("NumberingRules");
241 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
242 log
.println("WARNING !!! Exception getting numbering rules :");
243 e
.printStackTrace(log
);
244 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
245 log
.println("WARNING !!! Exception getting numbering rules :");
246 e
.printStackTrace(log
);
247 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
248 log
.println("WARNING !!! Exception getting numbering rules :");
249 e
.printStackTrace(log
);
250 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
251 log
.println("Property 'NumberingStyleName' is not supported.");
254 rules
= new PropertyValueSwitcher(rules1
, rules2
);
259 * Tested with custom property tester.
261 public void _NumberingStyleName() {
262 log
.println("Testing with custom Property tester");
263 testProperty("NumberingStyleName", NumberingStyleTester
);
267 * Tested with custom property tester.
269 public void _DropCapCharStyleName() {
270 log
.println("Testing with custom Property tester");
271 testProperty("DropCapCharStyleName", charStyleTester
);
275 * Tested with custom property tester.
277 public void _ParaStyleName() {
278 log
.println("Testing with custom Property tester");
279 testProperty("ParaStyleName", ParaStyleTester
);
283 * Tested with custom property tester.
285 public void _PageDescName() {
286 log
.println("Testing with custom Property tester");
287 testProperty("PageDescName", PageDescTester
);
291 * Tested with custom property tester. Before testing property
292 * <code>ParaAdjust</code> is setting to value <code>BLOCK</code>
293 * because setting the property <code>ParaLastLineAdjust</code>
294 * makes sense only in this case.
296 public void _ParaLastLineAdjust() {
297 log
.println("Testing with custom Property tester");
300 oObj
.setPropertyValue("ParaAdjust",
301 com
.sun
.star
.style
.ParagraphAdjust
.BLOCK
);
302 } catch (com
.sun
.star
.lang
.WrappedTargetException e
) {
303 log
.println("Exception occurred setting property 'ParagraphAdjust'" + e
);
304 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
) {
305 log
.println("Exception occurred setting property 'ParagraphAdjust'" + e
);
306 } catch (com
.sun
.star
.beans
.UnknownPropertyException e
) {
307 log
.println("Exception occurred setting property 'ParagraphAdjust'" + e
);
308 } catch (com
.sun
.star
.beans
.PropertyVetoException e
) {
309 log
.println("Exception occurred setting property 'ParagraphAdjust'" + e
);
312 testProperty("ParaLastLineAdjust", ShortTester
);
316 * Tested with custom property tester.
318 public void _ParaBackGraphicURL() {
319 log
.println("Testing with custom Property tester");
320 testProperty("ParaBackGraphicURL", URLTester
);
324 * Tested with custom property tester. <p>
325 * The following property tests are to be completed successfully before :
327 * <li> <code> NumberingStyleName </code> : a numbering style must
328 * be set before testing this property </li>
331 public void _NumberingLevel() {
332 requiredMethod("NumberingStyleName");
333 log
.println("Testing with custom Property tester");
334 testProperty("NumberingLevel", ShortTester
);
338 * Tested with custom property tester. <p>
340 public void _ParaIsConnectBorder() {
342 log
.println("Testing with custom Property tester");
343 testProperty("ParaIsConnectBorder", BooleanTester
);
347 * Tested with custom property tester.
349 public void _ParaVertAlignment() {
350 log
.println("Testing with custom Property tester");
351 testProperty("ParaVertAlignment", ShortTester
);
355 * Tested with com.sun.star.text.NumberingLevel <p>
356 * The value of this property is a com.sun.star.container.XIndexReplace which is represneted by
357 * com.sun.star.text.NumberingLevel.
358 * The following property tests are to be completed successfully before :
360 * <li> <code> NumberingStyleName </code> : a numbering style must
361 * be set before testing this property </li>
363 * @see com.sun.star.text.NumberlingLevel
364 * @see com.sun.star.container.XIndexReplace
365 * @see ifc.text._NumberingLevel
367 public void _NumberingRules() {
368 requiredMethod("NumberingStyleName");
370 XIndexReplace NumberingRules
= null;
371 PropertyValue
[] propertyValues
= null;
373 NumberingRules
= (XIndexReplace
) AnyConverter
.toObject(
374 new Type(XIndexReplace
.class), oObj
.getPropertyValue("NumberingRules"));
375 } catch (com
.sun
.star
.lang
.IllegalArgumentException ex
) {
376 Status
.failed( "could not get NumberingRuels: "+ ex
.toString() );
378 } catch (UnknownPropertyException ex
) {
379 Status
.failed( "could not get NumberingRuels: "+ ex
.toString() );
381 } catch (WrappedTargetException ex
) {
382 Status
.failed( "could not get NumberingRuels: "+ ex
.toString() );
386 propertyValues
= (PropertyValue
[]) NumberingRules
.getByIndex(0);
388 } catch (com
.sun
.star
.lang
.IndexOutOfBoundsException ex
) {
389 Status
.failed( "could not get NumberlingLevel-Array from NumberingRuels: "+ ex
.toString() );
391 } catch (WrappedTargetException ex
) {
392 Status
.failed( "could not get NumberlingLevel-Array from NumberingRuels: "+ ex
.toString() );
396 _NumberingLevel numb
= new _NumberingLevel((LogWriter
)log
, tParam
, propertyValues
);
398 boolean result
= numb
.testPropertieArray();
400 tRes
.tested("NumberingRules", result
);
403 public void _ParaUserDefinedAttributes() {
404 XNameContainer uda
= null;
409 uda
= (XNameContainer
) AnyConverter
.toObject(
410 new Type(XNameContainer
.class),
411 oObj
.getPropertyValue("ParaUserDefinedAttributes"));
412 } catch (com
.sun
.star
.lang
.IllegalArgumentException e
){
413 log
.println("ParaUserDefinedAttributes is empty.");
414 uda
= new _ParagraphProperties
.OwnUserDefinedAttributes();
416 AttributeData attr
= new AttributeData();
417 attr
.Namespace
= "http://www.sun.com/staroffice/apitest/Cellprop";
420 uda
.insertByName("Cellprop:has-first-alien-attribute", attr
);
422 String
[] els
= uda
.getElementNames();
423 oObj
.setPropertyValue("ParaUserDefinedAttributes", uda
);
424 uda
= (XNameContainer
) AnyConverter
.toObject(
425 new Type(XNameContainer
.class),
426 oObj
.getPropertyValue("ParaUserDefinedAttributes"));
427 els
= uda
.getElementNames();
429 Object obj
= uda
.getByName("Cellprop:has-first-alien-attribute");
431 } catch (com
.sun
.star
.beans
.UnknownPropertyException upe
) {
432 if (isOptional("ParaUserDefinedAttributes")) {
433 log
.println("Property is optional and not supported");
436 log
.println("Don't know the Property 'ParaUserDefinedAttributes'");
438 } catch (com
.sun
.star
.lang
.WrappedTargetException wte
) {
440 "WrappedTargetException while getting Property 'ParaUserDefinedAttributes'");
441 } catch (com
.sun
.star
.container
.NoSuchElementException nee
) {
442 log
.println("added Element isn't part of the NameContainer");
443 } catch (com
.sun
.star
.lang
.IllegalArgumentException iae
) {
445 "IllegalArgumentException while getting Property 'ParaUserDefinedAttributes'");
446 } catch (com
.sun
.star
.beans
.PropertyVetoException pve
) {
448 "PropertyVetoException while getting Property 'ParaUserDefinedAttributes'");
449 } catch (com
.sun
.star
.container
.ElementExistException eee
) {
451 "ElementExistException while getting Property 'ParaUserDefinedAttributes'");
454 tRes
.tested("ParaUserDefinedAttributes", res
);
457 private class OwnUserDefinedAttributes
implements XNameContainer
{
458 Hashtable members
= null;
461 public OwnUserDefinedAttributes() {
462 members
= new Hashtable();
465 public Object
getByName(String str
) throws com
.sun
.star
.container
.NoSuchElementException
, com
.sun
.star
.lang
.WrappedTargetException
{
466 return members
.get(str
);
469 public String
[] getElementNames() {
470 Enumeration oEnum
= members
.keys();
471 int count
= members
.size();
472 String
[] res
= new String
[count
];
474 while(oEnum
.hasMoreElements())
475 res
[i
] = (String
)oEnum
.nextElement();
479 public com
.sun
.star
.uno
.Type
getElementType() {
480 Enumeration oEnum
= members
.keys();
481 String key
= (String
)oEnum
.nextElement();
482 Object o
= members
.get(key
);
483 return new Type(o
.getClass());
486 public boolean hasByName(String str
) {
487 return members
.get(str
) != null;
490 public boolean hasElements() {
491 return members
.size() > 0;
494 public void insertByName(String str
, Object obj
) throws com
.sun
.star
.lang
.IllegalArgumentException
, com
.sun
.star
.container
.ElementExistException
, com
.sun
.star
.lang
.WrappedTargetException
{
495 members
.put(str
, obj
);
498 public void removeByName(String str
) throws com
.sun
.star
.container
.NoSuchElementException
, com
.sun
.star
.lang
.WrappedTargetException
{
502 public void replaceByName(String str
, Object obj
) throws com
.sun
.star
.lang
.IllegalArgumentException
, com
.sun
.star
.container
.NoSuchElementException
, com
.sun
.star
.lang
.WrappedTargetException
{
503 members
.put(str
, obj
);
507 } // finish class _ParagraphProperties