summaryrefslogtreecommitdiff
path: root/sc/inc/documentimport.hxx
blob: 2ffc75d67b82c0e1571aff3cb2ce61964d1c0c1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/*
 * This file is part of the LibreOffice project.
 *
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 */

#pragma once

#include "scdllapi.h"
#include "address.hxx"
#include "attarray.hxx"

#include <rtl/ustring.hxx>

#include <memory>
#include <vector>

class EditTextObject;
class ScDocument;
class ScColumn;
class ScPatternAttr;
class ScTokenArray;
class ScFormulaCell;
class ScStyleSheet;
struct ScSetStringParam;
struct ScTabOpParam;
struct ScDocumentImportImpl;
enum class SvtScriptType : sal_uInt8;

/**
 * Accessor class to ScDocument.  Its purpose is to allow import filter to
 * fill the document model and nothing but that.  Filling the document via
 * this class does not trigger any kind of broadcasting, drawing object
 * position calculation, or anything else that requires expensive
 * computation which are unnecessary and undesirable during import.
 */
class SC_DLLPUBLIC ScDocumentImport
{
    std::unique_ptr<ScDocumentImportImpl> mpImpl;

public:

    struct SC_DLLPUBLIC Attrs
    {
        std::vector<ScAttrEntry> mvData;

        bool mbLatinNumFmtOnly;

        Attrs();
        ~Attrs();
        Attrs& operator=( Attrs const & ) = delete; // MSVC2015 workaround
        Attrs( Attrs const & ) = delete; // MSVC2015 workaround
        bool operator==(const Attrs& other) const
        {
            return mvData == other.mvData && mbLatinNumFmtOnly == other.mbLatinNumFmtOnly;
        }
        Attrs& operator=( Attrs&& attrs ) = default;
    };

    ScDocumentImport() = delete;
    ScDocumentImport(ScDocument& rDoc);
    ScDocumentImport(const ScDocumentImport&) = delete;
    const ScDocumentImport& operator=(const ScDocumentImport&) = delete;
    ~ScDocumentImport();

    ScDocument& getDoc();
    const ScDocument& getDoc() const;

    /**
     * Initialize the storage for all sheets after all the sheet instances
     * have been created in the document.
     */
    void initForSheets();

    void setDefaultNumericScript(SvtScriptType nScript);

    /**
     * Apply specified cell style to an entire sheet.
     */
    void setCellStyleToSheet(SCTAB nTab, const ScStyleSheet& rStyle);

    /**
     * @param rName sheet name.
     *
     * @return 0-based sheet index, or -1 in case no sheet is found by
     *         specified name.
     */
    SCTAB getSheetIndex(const OUString& rName) const;
    SCTAB getSheetCount() const;
    bool appendSheet(const OUString& rName);
    void setSheetName(SCTAB nTab, const OUString& rName);

    void setOriginDate(sal_uInt16 nYear, sal_uInt16 nMonth, sal_uInt16 nDay);

    void setAutoInput(const ScAddress& rPos, const OUString& rStr,
            const ScSetStringParam* pStringParam = nullptr);
    void setNumericCell(const ScAddress& rPos, double fVal);
    void setStringCell(const ScAddress& rPos, const OUString& rStr);
    void setEditCell(const ScAddress& rPos, std::unique_ptr<EditTextObject> pEditText);

    void setFormulaCell(
        const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
        const double* pResult = nullptr );

    void setFormulaCell(
        const ScAddress& rPos, const OUString& rFormula, formula::FormulaGrammar::Grammar eGrammar,
        const OUString& rResult );

    void setFormulaCell(const ScAddress& rPos, std::unique_ptr<ScTokenArray> pArray);
    void setFormulaCell(const ScAddress& rPos, ScFormulaCell* pCell);

    void setMatrixCells(
        const ScRange& rRange, const ScTokenArray& rArray, formula::FormulaGrammar::Grammar eGrammar);

    void setTableOpCells(const ScRange& rRange, const ScTabOpParam& rParam);

    void fillDownCells(const ScAddress& rPos, SCROW nFillSize);

    /**
     * Set an array of cell attributes to specified range of columns.  This call
     * transfers the ownership of the ScAttrEntry array from the caller to the
     * column.
     */
    void setAttrEntries( SCTAB nTab, SCCOL nColStart, SCCOL nColEnd, Attrs&& rAttrs );

    void setRowsVisible(SCTAB nTab, SCROW nRowStart, SCROW nRowEnd, bool bVisible);

    void setMergedCells(SCTAB nTab, SCCOL nCol1, SCROW nRow1, SCCOL nCol2, SCROW nRow2);

    void invalidateBlockPositionSet(SCTAB nTab);

    void finalize();

    /** Broadcast all formula cells that are marked with
        FormulaTokenArray::IsRecalcModeMustAfterImport() for a subsequent
        ScDocument::CalcFormulaTree().
     */
    void broadcastRecalcAfterImport();

    /** small cache for hot call during import */
    bool isLatinScript(sal_uInt32 nFormat);
    bool isLatinScript(const ScPatternAttr&);

private:
    void initColumn(ScColumn& rCol);
    static void broadcastRecalcAfterImportColumn(ScColumn& rCol);
};

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */