Coverage Report

Created: 2025-07-07 10:01

/src/libreoffice/sc/inc/documentimport.hxx
Line
Count
Source
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 "scdllapi.h"
13
#include "address.hxx"
14
#include "attarray.hxx"
15
16
#include <rtl/ustring.hxx>
17
18
#include <memory>
19
#include <vector>
20
21
class EditTextObject;
22
class ScDocument;
23
class ScColumn;
24
class ScPatternAttr;
25
class ScTokenArray;
26
class ScFormulaCell;
27
class ScStyleSheet;
28
struct ScSetStringParam;
29
struct ScTabOpParam;
30
struct ScDocumentImportImpl;
31
enum class SvtScriptType : sal_uInt8;
32
33
/**
34
 * Accessor class to ScDocument.  Its purpose is to allow import filter to
35
 * fill the document model and nothing but that.  Filling the document via
36
 * this class does not trigger any kind of broadcasting, drawing object
37
 * position calculation, or anything else that requires expensive
38
 * computation which are unnecessary and undesirable during import.
39
 */
40
class SC_DLLPUBLIC ScDocumentImport
41
{
42
    std::unique_ptr<ScDocumentImportImpl> mpImpl;
43
44
public:
45
46
    struct SC_DLLPUBLIC Attrs
47
    {
48
        std::vector<ScAttrEntry> mvData;
49
50
        bool mbLatinNumFmtOnly;
51
52
        Attrs();
53
        ~Attrs();
54
        Attrs& operator=( Attrs const & ) = delete; // MSVC2015 workaround
55
        Attrs( Attrs const & ) = delete; // MSVC2015 workaround
56
        bool operator==(const Attrs& other) const
57
120M
        {
58
120M
            return mvData == other.mvData && mbLatinNumFmtOnly == other.mbLatinNumFmtOnly;
59
120M
        }
60
290k
        Attrs& operator=( Attrs&& attrs ) = default;
61
    };
62
63
    ScDocumentImport() = delete;
64
    ScDocumentImport(ScDocument& rDoc);
65
    ScDocumentImport(const ScDocumentImport&) = delete;
66
    const ScDocumentImport& operator=(const ScDocumentImport&) = delete;
67
    ~ScDocumentImport();
68
69
    ScDocument& getDoc();
70
    const ScDocument& getDoc() const;
71
72
    /**
73
     * Initialize the storage for all sheets after all the sheet instances
74
     * have been created in the document.
75
     */
76
    void initForSheets();
77
78
    void setDefaultNumericScript(SvtScriptType nScript);
79
80
    /**
81
     * Apply specified cell style to an entire sheet.
82
     */
83
    void setCellStyleToSheet(SCTAB nTab, const ScStyleSheet& rStyle);
84
85
    /**
86
     * @param rName sheet name.
87
     *
88
     * @return 0-based sheet index, or -1 in case no sheet is found by
89
     *         specified name.
90
     */
91
    SCTAB getSheetIndex(const OUString& rName) const;
92
    SCTAB getSheetCount() const;
93
    bool appendSheet(const OUString& rName);
94
    void setSheetName(SCTAB nTab, const OUString& rName);
95
96
    void setOriginDate(sal_uInt16 nYear, sal_uInt16 nMonth, sal_uInt16 nDay);
97
98
    void setAutoInput(const ScAddress& rPos, const OUString& rStr,
99
            const ScSetStringParam* pStringParam = nullptr);
100
    void setNumericCell(const ScAddress& rPos, double fVal);
101
    void setStringCell(const ScAddress& rPos, const OUString& rStr);
102
    void setEditCell(const ScAddress& rPos, std::unique_ptr<EditTextObject> pEditText);
103
104
    void setFormulaCell(
105
        const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
106
        const double* pResult = nullptr );
107
108
    void setFormulaCell(
109
        const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
110
        const OUString& rResult );
111
112
    void setFormulaCell(const ScAddress& rPos, std::unique_ptr<ScTokenArray> pArray);
113
    void setFormulaCell(const ScAddress& rPos, ScFormulaCell* pCell);
114
115
    void setMatrixCells(
116
        const ScRange& rRange, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGrammar);
117
118
    void setTableOpCells(const ScRange& rRange, const ScTabOpParam& rParam);
119
120
    void fillDownCells(const ScAddress& rPos, SCROW nFillSize);
121
122
    /**
123
     * Set an array of cell attributes to specified range of columns.  This call
124
     * transfers the ownership of the ScAttrEntry array from the caller to the
125
     * column.
126
     */
127
    void setAttrEntries( SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, Attrs&& rAttrs );
128
129
    void setRowsVisible(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, bool bVisible);
130
131
    void setMergedCells(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);
132
133
    void invalidateBlockPositionSet(SCTAB nTab);
134
135
    void finalize();
136
137
    /** Broadcast all formula cells that are marked with
138
        FormulaTokenArray::IsRecalcModeMustAfterImport() for a subsequent
139
        ScDocument::CalcFormulaTree().
140
     */
141
    void broadcastRecalcAfterImport();
142
143
    /** small cache for hot call during import */
144
    bool isLatinScript(sal_uInt32 nFormat);
145
    bool isLatinScript(const ScPatternAttr&);
146
147
private:
148
    void initColumn(ScColumn& rCol);
149
    static void broadcastRecalcAfterImportColumn(ScColumn& rCol);
150
};
151
152
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */