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 
10 #pragma once
11 
12 #include "address.hxx"
13 #include "cellvalue.hxx"
14 #include "celltextattr.hxx"
15 
16 #include <memory>
17 #include <vector>
18 
19 class ScDocument;
20 class ScColumn;
21 class ScPatternAttr;
22 class ScPostIt;
23 class ScConditionalFormatList;
24 
25 namespace sc {
26 
27 struct ColumnBlockPosition;
28 class ColumnBlockPositionSet;
29 
30 class ClipContextBase
31 {
32     std::unique_ptr<ColumnBlockPositionSet> mpSet;
33 
34 public:
35     ClipContextBase() = delete;
36     ClipContextBase(const ClipContextBase&) = delete;
37     const ClipContextBase& operator=(const ClipContextBase&) = delete;
38     ClipContextBase(ScDocument& rDoc);
39     virtual ~ClipContextBase();
40 
41     ColumnBlockPosition* getBlockPosition(SCTAB nTab, SCCOL nCol);
getBlockPositionSet()42     ColumnBlockPositionSet* getBlockPositionSet() { return mpSet.get(); }
43 };
44 
45 class SC_DLLPUBLIC CopyFromClipContext final : public ClipContextBase
46 {
47     SCCOL mnDestCol1;
48     SCCOL mnDestCol2;
49     SCROW mnDestRow1;
50     SCROW mnDestRow2;
51     SCTAB mnTabStart;
52     SCTAB mnTabEnd;
53     ScDocument& mrDestDoc;
54     ScDocument* mpRefUndoDoc;
55     ScDocument* mpClipDoc;
56     InsertDeleteFlags mnInsertFlag;
57     InsertDeleteFlags mnDeleteFlag;
58 
59     std::vector<ScCellValue> maSingleCells;
60     std::vector<sc::CellTextAttr> maSingleCellAttrs;
61     std::vector<const ScPatternAttr*> maSinglePatterns;
62     std::vector<const ScPostIt*> maSingleNotes;
63 
64     ScConditionalFormatList* mpCondFormatList;
65     bool mbAsLink:1;
66     bool mbSkipAttrForEmptyCells:1;
67     bool mbCloneNotes:1;
68     bool mbTableProtected:1;
69 
70 public:
71 
72     struct Range
73     {
74         SCCOL mnCol1;
75         SCCOL mnCol2;
76         SCROW mnRow1;
77         SCROW mnRow2;
78     };
79 
80     CopyFromClipContext() = delete;
81     CopyFromClipContext(ScDocument& rDoc,
82         ScDocument* pRefUndoDoc, ScDocument* pClipDoc, InsertDeleteFlags nInsertFlag,
83         bool bAsLink, bool bSkipAttrForEmptyCells);
84 
85     virtual ~CopyFromClipContext() override;
86 
87     void setTabRange(SCTAB nStart, SCTAB nEnd);
88 
89     SCTAB getTabStart() const;
90     SCTAB getTabEnd() const;
91 
92     void setDestRange( SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2 );
93     Range getDestRange() const;
94 
95     ScDocument* getUndoDoc();
96     ScDocument* getClipDoc();
getDestDoc()97     ScDocument* getDestDoc() { return &mrDestDoc; }
98     InsertDeleteFlags getInsertFlag() const;
99 
100     void setDeleteFlag( InsertDeleteFlags nFlag );
101     InsertDeleteFlags getDeleteFlag() const;
102 
103     /**
104      * Set the column size of a "single cell" row, which is used when copying
105      * a single row of cells in a clip doc and pasting it into multiple
106      * rows by replicating it.
107      */
108     void setSingleCellColumnSize( size_t nSize );
109 
110     ScCellValue& getSingleCell( size_t nColOffset );
111     sc::CellTextAttr& getSingleCellAttr( size_t nColOffset );
112 
113     void setSingleCell( const ScAddress& rSrcPos, const ScColumn& rSrcCol );
114 
115 
116     const ScPatternAttr* getSingleCellPattern( size_t nColOffset ) const;
117     void setSingleCellPattern( size_t nColOffset, const ScPatternAttr* pAttr );
118 
119     const ScPostIt* getSingleCellNote( size_t nColOffset ) const;
120     void setSingleCellNote( size_t nColOffset, const ScPostIt* pNote );
121 
122     void setCondFormatList( ScConditionalFormatList* pCondFormatList );
123     ScConditionalFormatList* getCondFormatList();
124 
125     void setTableProtected( bool b );
126     bool isTableProtected() const;
127 
128     bool isAsLink() const;
129     bool isSkipAttrForEmptyCells() const;
130     bool isCloneNotes() const;
131     bool isDateCell( const ScColumn& rCol, SCROW nRow ) const;
132 };
133 
134 class CopyToClipContext final : public ClipContextBase
135 {
136     bool mbKeepScenarioFlags:1;
137 
138 public:
139     CopyToClipContext(ScDocument& rDoc, bool bKeepScenarioFlags);
140     virtual ~CopyToClipContext() override;
141 
142     bool isKeepScenarioFlags() const;
143 };
144 
145 class CopyToDocContext final : public ClipContextBase
146 {
147     bool mbStartListening;
148 
149 public:
150     CopyToDocContext(ScDocument& rDoc);
151     virtual ~CopyToDocContext() override;
152 
153     void setStartListening( bool b );
154     bool isStartListening() const;
155 };
156 
157 class MixDocContext final : public ClipContextBase
158 {
159 public:
160     MixDocContext(ScDocument& rDoc);
161     virtual ~MixDocContext() override;
162 };
163 
164 }
165 
166 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
167