163bba73cSAndrew Rist /**************************************************************
2*cb5f33c6Smseidel  *
363bba73cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
463bba73cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
563bba73cSAndrew Rist  * distributed with this work for additional information
663bba73cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
763bba73cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
863bba73cSAndrew Rist  * "License"); you may not use this file except in compliance
963bba73cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10*cb5f33c6Smseidel  *
1163bba73cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12*cb5f33c6Smseidel  *
1363bba73cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
1463bba73cSAndrew Rist  * software distributed under the License is distributed on an
1563bba73cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1663bba73cSAndrew Rist  * KIND, either express or implied.  See the License for the
1763bba73cSAndrew Rist  * specific language governing permissions and limitations
1863bba73cSAndrew Rist  * under the License.
19*cb5f33c6Smseidel  *
2063bba73cSAndrew Rist  *************************************************************/
2163bba73cSAndrew Rist 
2263bba73cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_xmloff.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir #include <tools/debug.hxx>
28cdf0e10cSrcweir #include <com/sun/star/beans/XPropertySet.hpp>
29cdf0e10cSrcweir #include <com/sun/star/beans/PropertyValue.hpp>
30cdf0e10cSrcweir #include <com/sun/star/container/XIndexReplace.hpp>
31cdf0e10cSrcweir #include <com/sun/star/style/NumberingType.hpp>
32cdf0e10cSrcweir #include <com/sun/star/container/XNamed.hpp>
33cdf0e10cSrcweir #include "XMLTextNumRuleInfo.hxx"
34cdf0e10cSrcweir // --> OD 2008-04-25 #refactorlists#
35cdf0e10cSrcweir #include "xmloff/XMLTextListAutoStylePool.hxx"
36cdf0e10cSrcweir // <--
37cdf0e10cSrcweir 
38cdf0e10cSrcweir using ::rtl::OUString;
39cdf0e10cSrcweir 
40cdf0e10cSrcweir using namespace ::com::sun::star::uno;
41cdf0e10cSrcweir using namespace ::com::sun::star::beans;
42cdf0e10cSrcweir using namespace ::com::sun::star::container;
43cdf0e10cSrcweir using namespace ::com::sun::star::style;
44cdf0e10cSrcweir 
45cdf0e10cSrcweir // --> OD 2008-05-08 #refactorlists#
46cdf0e10cSrcweir // Complete refactoring of the class and enhancement of the class for lists.
47cdf0e10cSrcweir XMLTextNumRuleInfo::XMLTextNumRuleInfo()
48cdf0e10cSrcweir     : msNumberingRules(RTL_CONSTASCII_USTRINGPARAM("NumberingRules"))
49cdf0e10cSrcweir     , msNumberingLevel(RTL_CONSTASCII_USTRINGPARAM("NumberingLevel"))
50cdf0e10cSrcweir     , msNumberingStartValue(RTL_CONSTASCII_USTRINGPARAM("NumberingStartValue"))
51cdf0e10cSrcweir     , msParaIsNumberingRestart(RTL_CONSTASCII_USTRINGPARAM("ParaIsNumberingRestart"))
52cdf0e10cSrcweir     , msNumberingIsNumber(RTL_CONSTASCII_USTRINGPARAM("NumberingIsNumber"))
53cdf0e10cSrcweir     , msNumberingIsOutline(RTL_CONSTASCII_USTRINGPARAM("NumberingIsOutline"))
54cdf0e10cSrcweir     , msPropNameListId(RTL_CONSTASCII_USTRINGPARAM("ListId"))
55cdf0e10cSrcweir     , msPropNameStartWith(RTL_CONSTASCII_USTRINGPARAM("StartWith"))
56cdf0e10cSrcweir     // --> OD 2008-11-26 #158694#
57*cb5f33c6Smseidel     , msContinuingPreviousSubTree(RTL_CONSTASCII_USTRINGPARAM("ContinueingPreviousSubTree"))
58cdf0e10cSrcweir     , msListLabelStringProp(RTL_CONSTASCII_USTRINGPARAM("ListLabelString"))
59cdf0e10cSrcweir     // <--
60cdf0e10cSrcweir     , mxNumRules()
61cdf0e10cSrcweir     , msNumRulesName()
62cdf0e10cSrcweir     , msListId()
63cdf0e10cSrcweir     , mnListStartValue( -1 )
64cdf0e10cSrcweir     , mnListLevel( 0 )
65cdf0e10cSrcweir     , mbIsNumbered( sal_False )
66cdf0e10cSrcweir     , mbIsRestart( sal_False )
67cdf0e10cSrcweir     , mnListLevelStartValue( -1 )
68cdf0e10cSrcweir     , mbOutlineStyleAsNormalListStyle( sal_False )
69cdf0e10cSrcweir {
70cdf0e10cSrcweir 	Reset();
71cdf0e10cSrcweir }
72cdf0e10cSrcweir 
73cdf0e10cSrcweir // --> OD 2006-09-27 #i69627#
74cdf0e10cSrcweir void XMLTextNumRuleInfo::Set(
75cdf0e10cSrcweir         const ::com::sun::star::uno::Reference <
76cdf0e10cSrcweir                         ::com::sun::star::text::XTextContent > & xTextContent,
77cdf0e10cSrcweir         const sal_Bool bOutlineStyleAsNormalListStyle,
78cdf0e10cSrcweir         const XMLTextListAutoStylePool& rListAutoPool,
79cdf0e10cSrcweir         // --> OD 2008-11-26 #158694#
80cdf0e10cSrcweir         const sal_Bool bExportTextNumberElement )
81cdf0e10cSrcweir         // <--
82cdf0e10cSrcweir {
83cdf0e10cSrcweir 	Reset();
84cdf0e10cSrcweir     // --> OD 2006-09-27 #i69627#
85cdf0e10cSrcweir     mbOutlineStyleAsNormalListStyle = bOutlineStyleAsNormalListStyle;
86cdf0e10cSrcweir     // <--
87cdf0e10cSrcweir 
88cdf0e10cSrcweir 	Reference< XPropertySet > xPropSet( xTextContent, UNO_QUERY );
89cdf0e10cSrcweir 	Reference< XPropertySetInfo > xPropSetInfo = xPropSet->getPropertySetInfo();
90cdf0e10cSrcweir 
91cdf0e10cSrcweir     // check if this paragraph supports a numbering
92cdf0e10cSrcweir     if( !xPropSetInfo->hasPropertyByName( msNumberingLevel ) )
93cdf0e10cSrcweir 		return;
94cdf0e10cSrcweir 
95cdf0e10cSrcweir     if( xPropSet->getPropertyValue( msNumberingLevel ) >>= mnListLevel )
96cdf0e10cSrcweir 	{
97cdf0e10cSrcweir         if( xPropSetInfo->hasPropertyByName( msNumberingRules ) )
98cdf0e10cSrcweir         {
99cdf0e10cSrcweir             xPropSet->getPropertyValue( msNumberingRules ) >>= mxNumRules;
100cdf0e10cSrcweir         }
101cdf0e10cSrcweir 	}
102cdf0e10cSrcweir 	else
103cdf0e10cSrcweir 	{
104cdf0e10cSrcweir 		// in applications using the outliner we always have a numbering rule,
105cdf0e10cSrcweir 		// so a void property no numbering
106cdf0e10cSrcweir         mnListLevel = 0;
107cdf0e10cSrcweir 	}
108cdf0e10cSrcweir 
109cdf0e10cSrcweir     // --> OD 2008-12-17 #i97312#
110cdf0e10cSrcweir     if ( mxNumRules.is() && mxNumRules->getCount() < 1 )
111cdf0e10cSrcweir     {
112cdf0e10cSrcweir         DBG_ASSERT( false,
113cdf0e10cSrcweir                     "<XMLTextNumRuleInfo::Set(..)> - numbering rules instance does not contain any numbering rule" );
114cdf0e10cSrcweir         Reset();
115cdf0e10cSrcweir         return;
116cdf0e10cSrcweir     }
117cdf0e10cSrcweir     // <--
118cdf0e10cSrcweir 
119cdf0e10cSrcweir     // --> OD 2010-01-13 #b6912256#
120cdf0e10cSrcweir     if ( mnListLevel < 0 )
121cdf0e10cSrcweir     {
122cdf0e10cSrcweir         DBG_ASSERT( false,
123cdf0e10cSrcweir                     "<XMLTextNumRuleInfo::Set(..)> - unexpected numbering level" );
124cdf0e10cSrcweir         Reset();
125cdf0e10cSrcweir         return;
126cdf0e10cSrcweir     }
127cdf0e10cSrcweir 
128cdf0e10cSrcweir     // --> OD 2006-09-27 #i69627#
129cdf0e10cSrcweir     bool bSuppressListStyle( false );
130cdf0e10cSrcweir     if ( mxNumRules.is() )
131cdf0e10cSrcweir     {
132cdf0e10cSrcweir         if ( !mbOutlineStyleAsNormalListStyle )
133cdf0e10cSrcweir         {
134cdf0e10cSrcweir             sal_Bool bIsOutline = sal_False;
135cdf0e10cSrcweir             Reference<XPropertySet> xNumRulesProps(mxNumRules, UNO_QUERY);
136cdf0e10cSrcweir             if ( xNumRulesProps.is() &&
137cdf0e10cSrcweir                  xNumRulesProps->getPropertySetInfo()->
138cdf0e10cSrcweir                                     hasPropertyByName( msNumberingIsOutline ) )
139cdf0e10cSrcweir             {
140cdf0e10cSrcweir                 xNumRulesProps->getPropertyValue( msNumberingIsOutline ) >>= bIsOutline;
141cdf0e10cSrcweir                 bSuppressListStyle = bIsOutline ? true : false;
142cdf0e10cSrcweir             }
143cdf0e10cSrcweir         }
144cdf0e10cSrcweir     }
145cdf0e10cSrcweir 
146cdf0e10cSrcweir     if( mxNumRules.is() && !bSuppressListStyle )
147cdf0e10cSrcweir     // <--
148cdf0e10cSrcweir 	{
149cdf0e10cSrcweir         // First try to find the numbering rules in the list auto style pool.
150cdf0e10cSrcweir         // If not found, the numbering rules instance has to be named.
151cdf0e10cSrcweir         msNumRulesName = rListAutoPool.Find( mxNumRules );
152cdf0e10cSrcweir         if ( msNumRulesName.getLength() == 0 )
153cdf0e10cSrcweir         {
154cdf0e10cSrcweir             Reference < XNamed > xNamed( mxNumRules, UNO_QUERY );
155cdf0e10cSrcweir             DBG_ASSERT( xNamed.is(),
156cdf0e10cSrcweir                         "<XMLTextNumRuleInfo::Set(..)> - numbering rules instance have to be named. Serious defect -> please inform OD." );
157cdf0e10cSrcweir             if( xNamed.is() )
158cdf0e10cSrcweir             {
159cdf0e10cSrcweir                 msNumRulesName = xNamed->getName();
160cdf0e10cSrcweir             }
161cdf0e10cSrcweir         }
162cdf0e10cSrcweir         DBG_ASSERT( msNumRulesName.getLength() > 0,
163cdf0e10cSrcweir                     "<XMLTextNumRuleInfo::Set(..)> - no name found for numbering rules instance. Serious defect -> please inform OD." );
164cdf0e10cSrcweir 
165cdf0e10cSrcweir         if( xPropSetInfo->hasPropertyByName( msPropNameListId ) )
166cdf0e10cSrcweir         {
167cdf0e10cSrcweir             xPropSet->getPropertyValue( msPropNameListId ) >>= msListId;
168cdf0e10cSrcweir         }
169cdf0e10cSrcweir 
170cdf0e10cSrcweir         // --> OD 2008-11-26 #158694#
171cdf0e10cSrcweir         mbContinueingPreviousSubTree = sal_False;
172*cb5f33c6Smseidel         if( xPropSetInfo->hasPropertyByName( msContinuingPreviousSubTree ) )
173cdf0e10cSrcweir         {
174*cb5f33c6Smseidel             xPropSet->getPropertyValue( msContinuingPreviousSubTree ) >>= mbContinueingPreviousSubTree;
175cdf0e10cSrcweir         }
176cdf0e10cSrcweir         // <--
177cdf0e10cSrcweir 
178cdf0e10cSrcweir         mbIsNumbered = sal_True;
179cdf0e10cSrcweir         if( xPropSetInfo->hasPropertyByName( msNumberingIsNumber ) )
180cdf0e10cSrcweir 		{
181cdf0e10cSrcweir             if( !(xPropSet->getPropertyValue( msNumberingIsNumber ) >>= mbIsNumbered ) )
182cdf0e10cSrcweir             {
183cdf0e10cSrcweir     			OSL_ENSURE( false, "numbered paragraph without number info" );
184cdf0e10cSrcweir                 mbIsNumbered = sal_False;
185cdf0e10cSrcweir             }
186cdf0e10cSrcweir 		}
187cdf0e10cSrcweir 
188cdf0e10cSrcweir         if( mbIsNumbered )
189cdf0e10cSrcweir 		{
190cdf0e10cSrcweir             if( xPropSetInfo->hasPropertyByName( msParaIsNumberingRestart ) )
191cdf0e10cSrcweir 			{
192cdf0e10cSrcweir                 xPropSet->getPropertyValue( msParaIsNumberingRestart ) >>= mbIsRestart;
193cdf0e10cSrcweir 			}
194cdf0e10cSrcweir             if( xPropSetInfo->hasPropertyByName( msNumberingStartValue ) )
195cdf0e10cSrcweir 			{
196cdf0e10cSrcweir                 xPropSet->getPropertyValue( msNumberingStartValue ) >>= mnListStartValue;
197cdf0e10cSrcweir 			}
198cdf0e10cSrcweir 		}
199cdf0e10cSrcweir 
200cdf0e10cSrcweir         OSL_ENSURE( mnListLevel < mxNumRules->getCount(), "wrong num rule level" );
201cdf0e10cSrcweir         if( mnListLevel >= mxNumRules->getCount() )
202cdf0e10cSrcweir 		{
203cdf0e10cSrcweir 			Reset();
204cdf0e10cSrcweir 			return;
205cdf0e10cSrcweir 		}
206cdf0e10cSrcweir 
207cdf0e10cSrcweir         Sequence<PropertyValue> aProps;
208cdf0e10cSrcweir         mxNumRules->getByIndex( mnListLevel ) >>= aProps;
209cdf0e10cSrcweir 
210cdf0e10cSrcweir         const PropertyValue* pPropArray = aProps.getConstArray();
211cdf0e10cSrcweir         sal_Int32 nCount = aProps.getLength();
212cdf0e10cSrcweir         for( sal_Int32 i=0; i<nCount; i++ )
213cdf0e10cSrcweir         {
214cdf0e10cSrcweir           const PropertyValue& rProp = pPropArray[i];
215cdf0e10cSrcweir 
216cdf0e10cSrcweir             if ( rProp.Name == msPropNameStartWith )
217cdf0e10cSrcweir             {
218cdf0e10cSrcweir                 rProp.Value >>= mnListLevelStartValue;
219cdf0e10cSrcweir                 break;
220cdf0e10cSrcweir             }
221cdf0e10cSrcweir         }
222cdf0e10cSrcweir 
223cdf0e10cSrcweir         // --> OD 2008-11-26 #158694#
224cdf0e10cSrcweir         msListLabelString = ::rtl::OUString();
225cdf0e10cSrcweir         if ( bExportTextNumberElement &&
226cdf0e10cSrcweir              xPropSetInfo->hasPropertyByName( msListLabelStringProp ) )
227cdf0e10cSrcweir         {
228cdf0e10cSrcweir             xPropSet->getPropertyValue( msListLabelStringProp ) >>= msListLabelString;
229cdf0e10cSrcweir         }
230cdf0e10cSrcweir         // <--
231cdf0e10cSrcweir 
232cdf0e10cSrcweir         // paragraph's list level range is [0..9] representing list levels [1..10]
233cdf0e10cSrcweir         ++mnListLevel;
234cdf0e10cSrcweir 	}
235cdf0e10cSrcweir     else
236cdf0e10cSrcweir     {
237cdf0e10cSrcweir         mnListLevel = 0;
238cdf0e10cSrcweir     }
239cdf0e10cSrcweir }
240cdf0e10cSrcweir 
241cdf0e10cSrcweir sal_Bool XMLTextNumRuleInfo::BelongsToSameList( const XMLTextNumRuleInfo& rCmp ) const
242cdf0e10cSrcweir {
243cdf0e10cSrcweir     sal_Bool bRet( sal_True );
244cdf0e10cSrcweir     // Currently only the text documents support <ListId>.
245cdf0e10cSrcweir     if ( rCmp.msListId.getLength() > 0 ||
246cdf0e10cSrcweir          msListId.getLength() > 0 )
247cdf0e10cSrcweir     {
248cdf0e10cSrcweir         bRet = rCmp.msListId == msListId;
249cdf0e10cSrcweir     }
250cdf0e10cSrcweir     else
251cdf0e10cSrcweir     {
252cdf0e10cSrcweir         bRet = HasSameNumRules( rCmp );
253cdf0e10cSrcweir     }
254cdf0e10cSrcweir 
255cdf0e10cSrcweir     return bRet;
256cdf0e10cSrcweir }
257cdf0e10cSrcweir // <--
258