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 <vector> 23 #include <tools/gen.hxx> 24 #include <rangelst.hxx> 25 #include <printopt.hxx> 26 27 class ScDocShell; 28 class ScMarkData; 29 class OutputDevice; 30 31 /** Possible types of selection for print functions */ 32 33 enum ScPrintSelectionMode 34 { 35 SC_PRINTSEL_INVALID, 36 SC_PRINTSEL_DOCUMENT, 37 SC_PRINTSEL_CURSOR, 38 SC_PRINTSEL_RANGE, 39 SC_PRINTSEL_RANGE_EXCLUSIVELY_OLE_AND_DRAW_OBJECTS 40 }; 41 42 /** Stores the selection in the ScPrintFuncCache so it is only used 43 for the same selection again. */ 44 45 class ScPrintSelectionStatus 46 { 47 ScPrintSelectionMode eMode; 48 ScRangeList aRanges; 49 ScPrintOptions aOptions; 50 51 public: ScPrintSelectionStatus()52 ScPrintSelectionStatus() : eMode(SC_PRINTSEL_INVALID) {} 53 SetMode(ScPrintSelectionMode eNew)54 void SetMode(ScPrintSelectionMode eNew) { eMode = eNew; } SetRanges(const ScRangeList & rNew)55 void SetRanges(const ScRangeList& rNew) { aRanges = rNew; } SetOptions(const ScPrintOptions & rNew)56 void SetOptions(const ScPrintOptions& rNew) { aOptions = rNew; } 57 operator ==(const ScPrintSelectionStatus & rOther) const58 bool operator==(const ScPrintSelectionStatus& rOther) const 59 { return eMode == rOther.eMode && aRanges == rOther.aRanges && aOptions == rOther.aOptions; } 60 GetMode() const61 ScPrintSelectionMode GetMode() const { return eMode; } GetOptions() const62 const ScPrintOptions& GetOptions() const { return aOptions; } 63 }; 64 65 /** The range that is printed on a page (excluding repeated columns/rows), 66 and its position on the page, used to find hyperlink targets. */ 67 68 struct ScPrintPageLocation 69 { 70 tools::Long nPage; 71 ScRange aCellRange; 72 tools::Rectangle aRectangle; // pixels 73 ScPrintPageLocationScPrintPageLocation74 ScPrintPageLocation() : 75 nPage(-1) {} // default: invalid 76 ScPrintPageLocationScPrintPageLocation77 ScPrintPageLocation( tools::Long nP, const ScRange& rRange, const tools::Rectangle& rRect ) : 78 nPage(nP), aCellRange(rRange), aRectangle(rRect) {} 79 }; 80 81 /** Stores the data for printing that is needed from several sheets, 82 so it doesn't have to be calculated for rendering each page. */ 83 84 class ScPrintFuncCache 85 { 86 ScPrintSelectionStatus aSelection; 87 ScDocShell* pDocSh; 88 tools::Long nTotalPages; 89 std::vector<tools::Long> nPages; 90 std::vector<tools::Long> nFirstAttr; 91 std::vector<ScPrintPageLocation> aLocations; 92 bool bLocInitialized; 93 94 public: 95 ScPrintFuncCache( ScDocShell* pD, const ScMarkData& rMark, 96 const ScPrintSelectionStatus& rStatus ); 97 ~ScPrintFuncCache(); 98 99 bool IsSameSelection( const ScPrintSelectionStatus& rStatus ) const; 100 101 void InitLocations( const ScMarkData& rMark, OutputDevice* pDev ); 102 bool FindLocation( const ScAddress& rCell, ScPrintPageLocation& rLocation ) const; 103 GetPageCount() const104 tools::Long GetPageCount() const { return nTotalPages; } GetFirstAttr(SCTAB nTab) const105 tools::Long GetFirstAttr( SCTAB nTab ) const { return nFirstAttr[nTab]; } 106 SCTAB GetTabForPage( tools::Long nPage ) const; 107 tools::Long GetTabStart( SCTAB nTab ) const; 108 tools::Long GetDisplayStart( SCTAB nTab ) const; 109 }; 110 111 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ 112