xref: /aoo4110/main/xmloff/inc/txtlists.hxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski #ifndef _XMLOFF_TXTLISTS_HXX
25*b1cdbd2cSJim Jagielski #define _XMLOFF_TXTLISTS_HXX
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <rtl/ustring.hxx>
28*b1cdbd2cSJim Jagielski #include <comphelper/stl_types.hxx>
29*b1cdbd2cSJim Jagielski #include <map>
30*b1cdbd2cSJim Jagielski #include <vector>
31*b1cdbd2cSJim Jagielski #include <stack>
32*b1cdbd2cSJim Jagielski #include <boost/utility.hpp>
33*b1cdbd2cSJim Jagielski #include <boost/tuple/tuple.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexReplace.hpp>
35*b1cdbd2cSJim Jagielski #include <xmloff/xmlictxt.hxx>
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski class SvXMLImport;
38*b1cdbd2cSJim Jagielski class XMLTextListBlockContext;
39*b1cdbd2cSJim Jagielski class XMLTextListItemContext;
40*b1cdbd2cSJim Jagielski class XMLNumberedParaContext;
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski class XMLTextListsHelper : private boost::noncopyable
43*b1cdbd2cSJim Jagielski {
44*b1cdbd2cSJim Jagielski     public:
45*b1cdbd2cSJim Jagielski         XMLTextListsHelper();
46*b1cdbd2cSJim Jagielski         ~XMLTextListsHelper();
47*b1cdbd2cSJim Jagielski 
48*b1cdbd2cSJim Jagielski         /// list stack for importing:
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski         /// push a list context on the list context stack
51*b1cdbd2cSJim Jagielski         void PushListContext(XMLTextListBlockContext *i_pListBlock = 0);
52*b1cdbd2cSJim Jagielski         void PushListContext(XMLNumberedParaContext *i_pNumberedParagraph);
53*b1cdbd2cSJim Jagielski         /// pop the list context stack
54*b1cdbd2cSJim Jagielski         void PopListContext();
55*b1cdbd2cSJim Jagielski         /// peek at the top of the list context stack
56*b1cdbd2cSJim Jagielski         void ListContextTop(XMLTextListBlockContext*& o_pListBlockContext,
57*b1cdbd2cSJim Jagielski             XMLTextListItemContext*& o_pListItemContext,
58*b1cdbd2cSJim Jagielski             XMLNumberedParaContext*& o_pNumberedParagraphContext );
59*b1cdbd2cSJim Jagielski         /// set list item on top of the list context stack
60*b1cdbd2cSJim Jagielski         void SetListItem( XMLTextListItemContext *pListItem );
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski 
63*b1cdbd2cSJim Jagielski         // keeping track of processed lists for import and export
64*b1cdbd2cSJim Jagielski         // --> OD 2008-08-15 #i92811#
65*b1cdbd2cSJim Jagielski         // - add optional parameter <sListStyleDefaultListId>
66*b1cdbd2cSJim Jagielski         void KeepListAsProcessed( ::rtl::OUString sListId,
67*b1cdbd2cSJim Jagielski                                   ::rtl::OUString sListStyleName,
68*b1cdbd2cSJim Jagielski                                   ::rtl::OUString sContinueListId,
69*b1cdbd2cSJim Jagielski                                   ::rtl::OUString sListStyleDefaultListId = ::rtl::OUString() );
70*b1cdbd2cSJim Jagielski         // <--
71*b1cdbd2cSJim Jagielski 
72*b1cdbd2cSJim Jagielski         sal_Bool IsListProcessed( const ::rtl::OUString sListId ) const;
73*b1cdbd2cSJim Jagielski         ::rtl::OUString GetListStyleOfProcessedList(
74*b1cdbd2cSJim Jagielski                                         const ::rtl::OUString sListId ) const;
75*b1cdbd2cSJim Jagielski         ::rtl::OUString GetContinueListIdOfProcessedList(
76*b1cdbd2cSJim Jagielski                                         const ::rtl::OUString sListId ) const;
77*b1cdbd2cSJim Jagielski         const ::rtl::OUString& GetLastProcessedListId() const;
78*b1cdbd2cSJim Jagielski         const ::rtl::OUString& GetListStyleOfLastProcessedList() const;
79*b1cdbd2cSJim Jagielski 
80*b1cdbd2cSJim Jagielski         ::rtl::OUString GenerateNewListId() const;
81*b1cdbd2cSJim Jagielski 
82*b1cdbd2cSJim Jagielski         // --> OD 2008-08-15 #i92811#
83*b1cdbd2cSJim Jagielski         // provide list id for a certain list block for import
84*b1cdbd2cSJim Jagielski         ::rtl::OUString GetListIdForListBlock( XMLTextListBlockContext& rListBlock );
85*b1cdbd2cSJim Jagielski         // <--
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski         // keep track of continue list chain for export
89*b1cdbd2cSJim Jagielski         void StoreLastContinuingList( ::rtl::OUString sListId,
90*b1cdbd2cSJim Jagielski                                       ::rtl::OUString sContinuingListId );
91*b1cdbd2cSJim Jagielski 
92*b1cdbd2cSJim Jagielski         ::rtl::OUString GetLastContinuingListId( ::rtl::OUString sListId ) const;
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski         // keep track of opened list elements of a certain list for export
95*b1cdbd2cSJim Jagielski         void PushListOnStack( ::rtl::OUString sListId,
96*b1cdbd2cSJim Jagielski                               ::rtl::OUString sListStyleName );
97*b1cdbd2cSJim Jagielski         void PopListFromStack();
98*b1cdbd2cSJim Jagielski         sal_Bool EqualsToTopListStyleOnStack( const ::rtl::OUString sListId ) const;
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski         /** for importing numbered-paragraph
101*b1cdbd2cSJim Jagielski             note that the ID namespace for numbered-paragraph and regular list
102*b1cdbd2cSJim Jagielski             is distinct; we never combine a list and a n-p
103*b1cdbd2cSJim Jagielski          */
104*b1cdbd2cSJim Jagielski         ::com::sun::star::uno::Reference<
105*b1cdbd2cSJim Jagielski                 ::com::sun::star::container::XIndexReplace>
106*b1cdbd2cSJim Jagielski         EnsureNumberedParagraph(
107*b1cdbd2cSJim Jagielski             SvXMLImport & i_rImport,
108*b1cdbd2cSJim Jagielski             const ::rtl::OUString i_ListId,
109*b1cdbd2cSJim Jagielski             sal_Int16 & io_rLevel, const ::rtl::OUString i_StyleName);
110*b1cdbd2cSJim Jagielski 
111*b1cdbd2cSJim Jagielski         /// get ID of the last numbered-paragraph iff it has given style-name
112*b1cdbd2cSJim Jagielski         ::rtl::OUString GetNumberedParagraphListId(
113*b1cdbd2cSJim Jagielski             const sal_uInt16 i_Level,
114*b1cdbd2cSJim Jagielski             const ::rtl::OUString i_StyleName);
115*b1cdbd2cSJim Jagielski 
116*b1cdbd2cSJim Jagielski         /** Creates a NumRule from given style-name.
117*b1cdbd2cSJim Jagielski             @param i_rImport        the SvXMLImport
118*b1cdbd2cSJim Jagielski             @param i_xNumRule       parent num rule
119*b1cdbd2cSJim Jagielski             @param i_ParentStyleName  parent list style name
120*b1cdbd2cSJim Jagielski             @param i_StyleName      the list style name
121*b1cdbd2cSJim Jagielski             @param io_rLevel        the list level (may be reset if too large)
122*b1cdbd2cSJim Jagielski             @param o_rRestartNumbering   set to true if no style (defaulting)
123*b1cdbd2cSJim Jagielski             @param io_rSetDefaults  set to true if no style (defaulting)
124*b1cdbd2cSJim Jagielski          */
125*b1cdbd2cSJim Jagielski         static ::com::sun::star::uno::Reference<
126*b1cdbd2cSJim Jagielski                 ::com::sun::star::container::XIndexReplace> MakeNumRule(
127*b1cdbd2cSJim Jagielski             SvXMLImport & i_rImport,
128*b1cdbd2cSJim Jagielski             const ::com::sun::star::uno::Reference<
129*b1cdbd2cSJim Jagielski                 ::com::sun::star::container::XIndexReplace>& i_xNumRule,
130*b1cdbd2cSJim Jagielski             const ::rtl::OUString i_ParentStyleName,
131*b1cdbd2cSJim Jagielski             const ::rtl::OUString i_StyleName,
132*b1cdbd2cSJim Jagielski             sal_Int16 & io_rLevel,
133*b1cdbd2cSJim Jagielski             sal_Bool* o_pRestartNumbering = 0,
134*b1cdbd2cSJim Jagielski             sal_Bool* io_pSetDefaults = 0);
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski     private:
137*b1cdbd2cSJim Jagielski 
138*b1cdbd2cSJim Jagielski         /** list context: list, list-item, numbered-paragraph
139*b1cdbd2cSJim Jagielski             XMLTextListBlockContext, XMLTextListItemContext,
140*b1cdbd2cSJim Jagielski             XMLNumberedParaContext
141*b1cdbd2cSJim Jagielski          */
142*b1cdbd2cSJim Jagielski         typedef ::boost::tuple<SvXMLImportContextRef,
143*b1cdbd2cSJim Jagielski             SvXMLImportContextRef, SvXMLImportContextRef> ListStackFrame_t;
144*b1cdbd2cSJim Jagielski         ::std::stack< ListStackFrame_t > mListStack;
145*b1cdbd2cSJim Jagielski 
146*b1cdbd2cSJim Jagielski         // container type for processed lists:
147*b1cdbd2cSJim Jagielski         // map with <ListId> as key and pair( <ListStyleName, ContinueListId> )
148*b1cdbd2cSJim Jagielski         // as value
149*b1cdbd2cSJim Jagielski         typedef ::std::map< ::rtl::OUString,
150*b1cdbd2cSJim Jagielski                             ::std::pair< ::rtl::OUString, ::rtl::OUString >,
151*b1cdbd2cSJim Jagielski                             ::comphelper::UStringLess > tMapForLists;
152*b1cdbd2cSJim Jagielski         tMapForLists* mpProcessedLists;
153*b1cdbd2cSJim Jagielski         ::rtl::OUString msLastProcessedListId;
154*b1cdbd2cSJim Jagielski         ::rtl::OUString msListStyleOfLastProcessedList;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski         // --> OD 2008-08-15 #i92811#
157*b1cdbd2cSJim Jagielski         // additional container for processed lists.
158*b1cdbd2cSJim Jagielski         // map with <ListStyleName> as key and pair( <ListId, ListStyleDefaultListId> )
159*b1cdbd2cSJim Jagielski         // as value.
160*b1cdbd2cSJim Jagielski         tMapForLists* mpMapListIdToListStyleDefaultListId;
161*b1cdbd2cSJim Jagielski         // <--
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski         // container type to build up continue list chain:
164*b1cdbd2cSJim Jagielski         // map with <ListId> of master list as key and <ListId> of last list
165*b1cdbd2cSJim Jagielski         // continuing the master list as value
166*b1cdbd2cSJim Jagielski         typedef ::std::map< ::rtl::OUString, ::rtl::OUString,
167*b1cdbd2cSJim Jagielski                             ::comphelper::UStringLess > tMapForContinuingLists;
168*b1cdbd2cSJim Jagielski         tMapForContinuingLists* mpContinuingLists;
169*b1cdbd2cSJim Jagielski 
170*b1cdbd2cSJim Jagielski         // stack type for opened list elements and its list style:
171*b1cdbd2cSJim Jagielski         // vector with pair( <ListId>, <ListStyleName> ) as value
172*b1cdbd2cSJim Jagielski         typedef ::std::vector< ::std::pair< ::rtl::OUString, ::rtl::OUString > >
173*b1cdbd2cSJim Jagielski                                                                 tStackForLists;
174*b1cdbd2cSJim Jagielski         tStackForLists* mpListStack;
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski         /// to connect numbered-paragraphs that have no list-id attribute:
177*b1cdbd2cSJim Jagielski         /// vector of pair of style-name and list-id (indexed by level)
178*b1cdbd2cSJim Jagielski         typedef ::std::vector< ::std::pair< ::rtl::OUString, ::rtl::OUString > >
179*b1cdbd2cSJim Jagielski             LastNumberedParagraphs_t;
180*b1cdbd2cSJim Jagielski 
181*b1cdbd2cSJim Jagielski         LastNumberedParagraphs_t mLastNumberedParagraphs;
182*b1cdbd2cSJim Jagielski 
183*b1cdbd2cSJim Jagielski         /// numbered-paragraphs
184*b1cdbd2cSJim Jagielski         typedef ::std::vector< ::std::pair< ::rtl::OUString,
185*b1cdbd2cSJim Jagielski             ::com::sun::star::uno::Reference<
186*b1cdbd2cSJim Jagielski                 ::com::sun::star::container::XIndexReplace > > > NumParaList_t;
187*b1cdbd2cSJim Jagielski         ::std::map< ::rtl::OUString, NumParaList_t > mNPLists;
188*b1cdbd2cSJim Jagielski 
189*b1cdbd2cSJim Jagielski };
190*b1cdbd2cSJim Jagielski #endif
191