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