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
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
/* -*- 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/.
*
* This file incorporates work covered by the following license notice:
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
#pragma once
/*************************************************************************
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
The structure of auto formatting should not be changed. It is used
by various code of Writer and Calc. If a change is necessary, the
source code of both applications must be changed!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
**************************************************************************/
#include <svl/poolitem.hxx>
#include <svx/autoformathelper.hxx>
#include "scdllapi.h"
#include "zforauto.hxx"
#include <array>
#include <memory>
#include <map>
#include <climits>
class ScDocument;
/**
A binary blob of writer-specific data. This data typically consists of types that are
unavailable to Calc (e.g. SwFmtVertOrient), or that Calc doesn't care about.
@remarks Note that in autoformat versions prior to AUTOFORMAT_DATA_ID_31005, Calc
logic handled and stored several writer-specific items (such as ScAutoFormatDataField::aAdjust).
That logic was preserved. From _31005 onward, writer-specific data should be handled by
blobs to avoid needlessly complicating the Calc logic.
*/
struct AutoFormatSwBlob
{
std::unique_ptr<sal_uInt8[]> pData;
std::size_t size;
AutoFormatSwBlob() : size(0)
{
}
AutoFormatSwBlob(const AutoFormatSwBlob&) = delete;
const AutoFormatSwBlob& operator=(const AutoFormatSwBlob&) = delete;
void Reset()
{
pData.reset();
size = 0;
}
};
/// Struct with version numbers of the Items
struct ScAfVersions : public AutoFormatVersions
{
private:
AutoFormatSwBlob swVersions;
public:
ScAfVersions();
void Load( SvStream& rStream, sal_uInt16 nVer );
void Write(SvStream& rStream, sal_uInt16 fileVersion);
};
/// Contains all items for one cell of a table autoformat.
class ScAutoFormatDataField : public AutoFormatBase
{
private:
AutoFormatSwBlob m_swFields;
// number format
ScNumFormatAbbrev aNumFormat;
public:
ScAutoFormatDataField();
ScAutoFormatDataField( const ScAutoFormatDataField& rCopy );
~ScAutoFormatDataField();
// block assignment operator
ScAutoFormatDataField& operator=(const ScAutoFormatDataField& rRef) = delete;
// number format
const ScNumFormatAbbrev& GetNumFormat() const { return aNumFormat; }
// number format
void SetNumFormat( const ScNumFormatAbbrev& rNumFormat ) { aNumFormat = rNumFormat; }
bool Load( SvStream& rStream, const ScAfVersions& rVersions, sal_uInt16 nVer );
bool Save( SvStream& rStream, sal_uInt16 fileVersion );
};
class SC_DLLPUBLIC ScAutoFormatData
{
private:
OUString aName;
sal_uInt16 nStrResId;
// common flags of Calc and Writer
bool bIncludeFont : 1;
bool bIncludeJustify : 1;
bool bIncludeFrame : 1;
bool bIncludeBackground : 1;
// Calc specific flags
bool bIncludeValueFormat : 1;
bool bIncludeWidthHeight : 1;
// Writer-specific data
AutoFormatSwBlob m_swFields;
std::array<std::unique_ptr<ScAutoFormatDataField>,16> ppDataField;
SAL_DLLPRIVATE ScAutoFormatDataField& GetField( sal_uInt16 nIndex );
SAL_DLLPRIVATE const ScAutoFormatDataField& GetField( sal_uInt16 nIndex ) const;
public:
ScAutoFormatData();
ScAutoFormatData( const ScAutoFormatData& rData );
~ScAutoFormatData();
void SetName( const OUString& rName ) { aName = rName; nStrResId = USHRT_MAX; }
const OUString& GetName() const { return aName; }
bool GetIncludeValueFormat() const { return bIncludeValueFormat; }
bool GetIncludeFont() const { return bIncludeFont; }
bool GetIncludeJustify() const { return bIncludeJustify; }
bool GetIncludeFrame() const { return bIncludeFrame; }
bool GetIncludeBackground() const { return bIncludeBackground; }
bool GetIncludeWidthHeight() const { return bIncludeWidthHeight; }
void SetIncludeValueFormat( bool bValueFormat ) { bIncludeValueFormat = bValueFormat; }
void SetIncludeFont( bool bFont ) { bIncludeFont = bFont; }
void SetIncludeJustify( bool bJustify ) { bIncludeJustify = bJustify; }
void SetIncludeFrame( bool bFrame ) { bIncludeFrame = bFrame; }
void SetIncludeBackground( bool bBackground ) { bIncludeBackground = bBackground; }
void SetIncludeWidthHeight( bool bWidthHeight ) { bIncludeWidthHeight = bWidthHeight; }
const SfxPoolItem* GetItem( sal_uInt16 nIndex, sal_uInt16 nWhich ) const;
template<class T> const T* GetItem( sal_uInt16 nIndex, TypedWhichId<T> nWhich ) const
{
return static_cast<const T*>(GetItem(nIndex, sal_uInt16(nWhich)));
}
void PutItem( sal_uInt16 nIndex, const SfxPoolItem& rItem );
void CopyItem( sal_uInt16 nToIndex, sal_uInt16 nFromIndex, sal_uInt16 nWhich );
const ScNumFormatAbbrev& GetNumFormat( sal_uInt16 nIndex ) const;
bool HasSameData( sal_uInt16 nIndex1, sal_uInt16 nIndex2 ) const;
void FillToItemSet( sal_uInt16 nIndex, SfxItemSet& rItemSet, const ScDocument& rDoc ) const;
void GetFromItemSet( sal_uInt16 nIndex, const SfxItemSet& rItemSet, const ScNumFormatAbbrev& rNumFormat );
bool Load( SvStream& rStream, const ScAfVersions& rVersions );
bool Save( SvStream& rStream, sal_uInt16 fileVersion );
};
struct DefaultFirstEntry {
bool operator() (const OUString& left, const OUString& right) const;
};
class SC_DLLPUBLIC ScAutoFormat
{
typedef std::map<OUString, std::unique_ptr<ScAutoFormatData>, DefaultFirstEntry> MapType;
MapType m_Data;
bool mbSaveLater;
ScAfVersions m_aVersions;
ScAutoFormat(const ScAutoFormat&) = delete;
const ScAutoFormat operator=(const ScAutoFormat&) = delete;
public:
typedef MapType::const_iterator const_iterator;
typedef MapType::iterator iterator;
ScAutoFormat();
void Load();
bool Save();
void SetSaveLater( bool bSet );
bool IsSaveLater() const { return mbSaveLater; }
const ScAutoFormatData* findByIndex(size_t nIndex) const;
ScAutoFormatData* findByIndex(size_t nIndex);
iterator find(const OUString& rName);
iterator insert(std::unique_ptr<ScAutoFormatData> pNew);
void erase(const iterator& it);
size_t size() const;
const_iterator begin() const;
const_iterator end() const;
iterator begin();
iterator end();
};
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|