1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 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. 14 * 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). 20 * 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. 25 * 26 ************************************************************************/ 27 28 #ifndef _XMLOFF_XMLREDLINEEXPORT_HXX 29 #define _XMLOFF_XMLREDLINEEXPORT_HXX 30 31 #include <rtl/ustrbuf.hxx> 32 #include <com/sun/star/uno/Reference.h> 33 #include <com/sun/star/uno/Sequence.h> 34 35 #include <list> 36 #include <map> 37 #include <set> 38 39 class SvXMLExport; 40 namespace com { namespace sun { namespace star { 41 namespace beans { class XPropertySet; } 42 namespace beans { struct PropertyValue; } 43 namespace text { class XText; } 44 namespace text { class XTextContent; } 45 namespace text { class XTextSection; } 46 } } } 47 namespace rtl { 48 class OUString; 49 class OUStringBuffer; 50 } 51 52 // store a list of redline properties 53 typedef ::std::list< 54 ::com::sun::star::uno::Reference< 55 ::com::sun::star::beans::XPropertySet> > ChangesListType; 56 57 // store a list of redline properties for each XText 58 typedef ::std::map< 59 ::com::sun::star::uno::Reference< ::com::sun::star::text::XText>, 60 ChangesListType* > ChangesMapType; 61 62 63 /** 64 * This class handles the export of redline portions. 65 * It is to be called from XMLTextParagraphExport. 66 */ 67 class XMLRedlineExport 68 { 69 const ::rtl::OUString sDelete; 70 const ::rtl::OUString sDeletion; 71 const ::rtl::OUString sFormat; 72 const ::rtl::OUString sFormatChange; 73 const ::rtl::OUString sInsert; 74 const ::rtl::OUString sInsertion; 75 const ::rtl::OUString sIsCollapsed; 76 const ::rtl::OUString sIsStart; 77 const ::rtl::OUString sRedlineAuthor; 78 const ::rtl::OUString sRedlineComment; 79 const ::rtl::OUString sRedlineDateTime; 80 const ::rtl::OUString sRedlineSuccessorData; 81 const ::rtl::OUString sRedlineText; 82 const ::rtl::OUString sRedlineType; 83 const ::rtl::OUString sStyle; 84 const ::rtl::OUString sTextTable; 85 const ::rtl::OUString sUnknownChange; 86 const ::rtl::OUString sStartRedline; 87 const ::rtl::OUString sEndRedline; 88 const ::rtl::OUString sRedlineIdentifier; 89 const ::rtl::OUString sIsInHeaderFooter; 90 const ::rtl::OUString sRedlineProtectionKey; 91 const ::rtl::OUString sRecordChanges; 92 const ::rtl::OUString sMergeLastPara; 93 94 const ::rtl::OUString sChangePrefix; 95 96 SvXMLExport& rExport; 97 98 99 // handling of change recording: 100 101 // To support change tracking in headers and footers we need to 102 // write these changes separately. To do this, we record the 103 // changes for headers and footers. For the main document body, we 104 // get the complete list of changes from the document, which 105 // should be much more efficient than recording all of those. 106 107 ChangesMapType aChangeMap; /// map of recorded changes 108 109 /// list of current changes; is NULL or points to member of aChangeMap 110 ChangesListType* pCurrentChangesList; 111 112 113 public: 114 XMLRedlineExport(SvXMLExport& rExp); 115 116 ~XMLRedlineExport(); 117 118 /// export a change 119 void ExportChange( 120 /// PropertySet of RedlinePortion 121 const ::com::sun::star::uno::Reference< 122 ::com::sun::star::beans::XPropertySet> & rPropSet, 123 sal_Bool bAutoStyle); 124 125 /// export the list of changes (complete list minus recorded changed) 126 void ExportChangesList(sal_Bool bAutoStyles); 127 128 /// export the list of changes (recorded changes for this XText only) 129 void ExportChangesList( 130 const ::com::sun::star::uno::Reference< 131 ::com::sun::star::text::XText> & rText, 132 sal_Bool bAutoStyles); 133 134 /// set the current XText for which changes should be recorded. 135 /// An empty XText means: don't record changes 136 void SetCurrentXText( 137 const ::com::sun::star::uno::Reference< 138 ::com::sun::star::text::XText> & rText); 139 140 /// Do not record changes. 141 /// Same as SetCurrentXText(Reference<XText>) with empty argument. 142 void SetCurrentXText(); 143 144 /// export redline marks which start or end at start nodes, 145 /// i.e. that include the complete paragraph/table/section 146 void ExportStartOrEndRedline( 147 const ::com::sun::star::uno::Reference< 148 ::com::sun::star::beans::XPropertySet> & rPropSet, 149 sal_Bool bStart); /// start or end of text entity (e.g. paragraph)? 150 151 /// convenience method, calls XPropertySet-version of this method 152 void ExportStartOrEndRedline( 153 /// XTextContent; must also be an XPropertySet 154 const ::com::sun::star::uno::Reference< 155 ::com::sun::star::text::XTextContent> & rContent, 156 sal_Bool bStart); 157 158 /// convenience method, calls XPropertySet-version of this method 159 void ExportStartOrEndRedline( 160 /// XTextSection; must also be an XPropertySet 161 const ::com::sun::star::uno::Reference< 162 ::com::sun::star::text::XTextSection> & rSection, 163 sal_Bool bStart); 164 165 private: 166 167 /// export the change mark contained in the text body 168 void ExportChangeInline( 169 /// PropertySet of RedlinePortion 170 const ::com::sun::star::uno::Reference< 171 ::com::sun::star::beans::XPropertySet> & rPropSet); 172 173 /// export the auto styles used in this change 174 void ExportChangeAutoStyle( 175 /// PropertySet of RedlinePortion 176 const ::com::sun::star::uno::Reference< 177 ::com::sun::star::beans::XPropertySet> & rPropSet); 178 179 /// export the changes list (<text:tracked-changes>) 180 void ExportChangesListElements(); 181 182 /// export the auto styles needed by the changes list 183 void ExportChangesListAutoStyles(); 184 185 /// export the changed-region element 186 void ExportChangedRegion( 187 const ::com::sun::star::uno::Reference< 188 ::com::sun::star::beans::XPropertySet> & rPropSet); 189 190 /// export an change-info element (from a PropertySet) 191 void ExportChangeInfo( 192 const ::com::sun::star::uno::Reference< 193 ::com::sun::star::beans::XPropertySet> & rPropSet); 194 195 /// export an change-info element (from PropertyValues) 196 void ExportChangeInfo( 197 const ::com::sun::star::uno::Sequence< 198 ::com::sun::star::beans::PropertyValue> & rValues); 199 200 /// convert the change type from API to XML names 201 const ::rtl::OUString ConvertTypeName(const ::rtl::OUString& sApiName); 202 203 /// Get ID string! 204 const ::rtl::OUString GetRedlineID( 205 const ::com::sun::star::uno::Reference< 206 ::com::sun::star::beans::XPropertySet> & rPropSet); 207 208 /// write a comment string as sequence of <text:p> elements 209 void WriteComment(const ::rtl::OUString& rComment); 210 }; 211 212 #endif 213