1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ 2 /* 3 * This file is part of the LibreOffice project. 4 * 5 * This Source Code Form is subject to the terms of the Mozilla Public 6 * License, v. 2.0. If a copy of the MPL was not distributed with this 7 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 8 * 9 * This file incorporates work covered by the following license notice: 10 * 11 * Licensed to the Apache Software Foundation (ASF) under one or more 12 * contributor license agreements. See the NOTICE file distributed 13 * with this work for additional information regarding copyright 14 * ownership. The ASF licenses this file to you under the Apache 15 * License, Version 2.0 (the "License"); you may not use this file 16 * except in compliance with the License. You may obtain a copy of 17 * the License at http://www.apache.org/licenses/LICENSE-2.0 . 18 */ 19 20 #pragma once 21 22 #include <memory> 23 #include <string_view> 24 25 #include "worksheethelper.hxx" 26 27 namespace oox { class AttributeList; } 28 namespace oox { class PropertySet; } 29 namespace oox::core { class Relations; } 30 31 namespace oox::xls { 32 33 class HeaderFooterParser; 34 35 /** Holds page style data for a single sheet. */ 36 struct PageSettingsModel 37 { 38 css::uno::Reference<css::graphic::XGraphic> mxGraphic; /// Background Graphic 39 OUString maBinSettPath; /// Relation identifier of binary printer settings. 40 OUString maOddHeader; /// Header string for odd pages. 41 OUString maOddFooter; /// Footer string for odd pages. 42 OUString maEvenHeader; /// Header string for even pages. 43 OUString maEvenFooter; /// Footer string for even pages. 44 OUString maFirstHeader; /// Header string for first page of the sheet. 45 OUString maFirstFooter; /// Footer string for first page of the sheet. 46 double mfLeftMargin; /// Margin between left edge of page and begin of sheet area. 47 double mfRightMargin; /// Margin between end of sheet area and right edge of page. 48 double mfTopMargin; /// Margin between top edge of page and begin of sheet area. 49 double mfBottomMargin; /// Margin between end of sheet area and bottom edge of page. 50 double mfHeaderMargin; /// Margin between top edge of page and begin of header. 51 double mfFooterMargin; /// Margin between end of footer and bottom edge of page. 52 sal_Int32 mnPaperSize; /// Paper size (enumeration). 53 sal_Int32 mnPaperWidth; /// Paper width in twips 54 sal_Int32 mnPaperHeight; /// Paper height in twips 55 sal_Int32 mnCopies; /// Number of copies to print. 56 sal_Int32 mnScale; /// Page scale (zoom in percent). 57 sal_Int32 mnFirstPage; /// First page number. 58 sal_Int32 mnFitToWidth; /// Fit to number of pages in horizontal direction. 59 sal_Int32 mnFitToHeight; /// Fit to number of pages in vertical direction. 60 sal_Int32 mnHorPrintRes; /// Horizontal printing resolution in DPI. 61 sal_Int32 mnVerPrintRes; /// Vertical printing resolution in DPI. 62 sal_Int32 mnOrientation; /// Landscape or portrait. 63 sal_Int32 mnPageOrder; /// Page order through sheet area (to left or down). 64 sal_Int32 mnCellComments; /// Cell comments printing mode. 65 sal_Int32 mnPrintErrors; /// Cell error printing mode. 66 bool mbUseEvenHF; /// True = use maEvenHeader/maEvenFooter. 67 bool mbUseFirstHF; /// True = use maFirstHeader/maFirstFooter. 68 bool mbValidSettings; /// True = use imported settings. 69 bool mbUseFirstPage; /// True = start page numbering with mnFirstPage. 70 bool mbBlackWhite; /// True = print black and white. 71 bool mbDraftQuality; /// True = print in draft quality. 72 bool mbFitToPages; /// True = Fit to width/height; false = scale in percent. 73 bool mbHorCenter; /// True = horizontally centered. 74 bool mbVerCenter; /// True = vertically centered. 75 bool mbPrintGrid; /// True = print grid lines. 76 bool mbPrintHeadings; /// True = print column/row headings. 77 78 explicit PageSettingsModel(); 79 80 /** Sets the BIFF print errors mode. */ 81 void setBiffPrintErrors( sal_uInt8 nPrintErrors ); 82 }; 83 84 class PageSettings : public WorksheetHelper 85 { 86 public: 87 explicit PageSettings( const WorksheetHelper& rHelper ); 88 89 /** Imports printing options from a printOptions element. */ 90 void importPrintOptions( const AttributeList& rAttribs ); 91 /** Imports pageMarings element containing page margins. */ 92 void importPageMargins( const AttributeList& rAttribs ); 93 /** Imports pageSetup element for worksheets. */ 94 void importPageSetup( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); 95 /** Imports pageSetup element for chart sheets. */ 96 void importChartPageSetup( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); 97 /** Imports header and footer settings from a headerFooter element. */ 98 void importHeaderFooter( const AttributeList& rAttribs ); 99 /** Imports header/footer characters from a headerFooter element. */ 100 void importHeaderFooterCharacters( 101 std::u16string_view rChars, sal_Int32 nElement ); 102 /** Imports the picture element. */ 103 void importPicture( const ::oox::core::Relations& rRelations, const AttributeList& rAttribs ); 104 105 /** Imports the PRINTOPTIONS record from the passed stream. */ 106 void importPrintOptions( SequenceInputStream& rStrm ); 107 /** Imports the PAGEMARGINS record from the passed stream. */ 108 void importPageMargins( SequenceInputStream& rStrm ); 109 /** Imports the PAGESETUP record from the passed stream. */ 110 void importPageSetup( const ::oox::core::Relations& rRelations, SequenceInputStream& rStrm ); 111 /** Imports the CHARTPAGESETUP record from the passed stream. */ 112 void importChartPageSetup( const ::oox::core::Relations& rRelations, SequenceInputStream& rStrm ); 113 /** Imports the HEADERFOOTER record from the passed stream. */ 114 void importHeaderFooter( SequenceInputStream& rStrm ); 115 /** Imports the PICTURE record from the passed stream. */ 116 void importPicture( const ::oox::core::Relations& rRelations, SequenceInputStream& rStrm ); 117 118 /** Sets whether percentual scaling or fit to width/height scaling is used. */ 119 void setFitToPagesMode( bool bFitToPages ); 120 121 /** Creates a page style for the spreadsheet and sets all page properties. */ 122 void finalizeImport(); 123 124 private: 125 /** Imports the binary picture data from the fragment with the passed identifier. */ 126 void importPictureData( const ::oox::core::Relations& rRelations, const OUString& rRelId ); 127 128 private: 129 PageSettingsModel maModel; 130 }; 131 132 class PageSettingsConverter : public WorkbookHelper 133 { 134 public: 135 explicit PageSettingsConverter( const WorkbookHelper& rHelper ); 136 virtual ~PageSettingsConverter() override; 137 138 /** Writes all properties to the passed property set of a page style object. */ 139 void writePageSettingsProperties( 140 PropertySet& rPropSet, 141 const PageSettingsModel& rModel, 142 WorksheetType eSheetType ); 143 144 private: 145 struct HFHelperData 146 { 147 sal_Int32 mnLeftPropId; 148 sal_Int32 mnRightPropId; 149 sal_Int32 mnFirstPropId; 150 sal_Int32 mnHeight; 151 sal_Int32 mnBodyDist; 152 bool mbHasContent; 153 bool mbShareOddEven; 154 bool mbShareFirst; 155 bool mbDynamicHeight; 156 157 explicit HFHelperData( sal_Int32 nLeftPropId, sal_Int32 nRightPropId, sal_Int32 nFirstPropId ); 158 }; 159 160 private: 161 void convertHeaderFooterData( 162 PropertySet& rPropSet, 163 HFHelperData& orHFData, 164 const OUString& rOddContent, 165 const OUString& rEvenContent, 166 const OUString& rFirstContent, 167 bool bUseEvenContent, 168 bool bUseFirstContent, 169 double fPageMargin, 170 double fContentMargin ); 171 172 sal_Int32 writeHeaderFooter( 173 PropertySet& rPropSet, 174 sal_Int32 nPropId, 175 const OUString& rContent ); 176 177 private: 178 typedef ::std::unique_ptr< HeaderFooterParser > HeaderFooterParserPtr; 179 HeaderFooterParserPtr mxHFParser; 180 HFHelperData maHeaderData; 181 HFHelperData maFooterData; 182 }; 183 184 } // namespace oox::xls 185 186 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 187