1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski *
3*b1cdbd2cSJim Jagielski * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski * or more contributor license agreements. See the NOTICE file
5*b1cdbd2cSJim Jagielski * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski * regarding copyright ownership. The ASF licenses this file
7*b1cdbd2cSJim Jagielski * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski * with the License. You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski *
11*b1cdbd2cSJim Jagielski * http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski *
13*b1cdbd2cSJim Jagielski * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski * KIND, either express or implied. See the License for the
17*b1cdbd2cSJim Jagielski * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski * under the License.
19*b1cdbd2cSJim Jagielski *
20*b1cdbd2cSJim Jagielski *************************************************************/
21*b1cdbd2cSJim Jagielski
22*b1cdbd2cSJim Jagielski
23*b1cdbd2cSJim Jagielski
24*b1cdbd2cSJim Jagielski #include "oox/xls/stylesbuffer.hxx"
25*b1cdbd2cSJim Jagielski
26*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontDescriptor.hpp>
27*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontFamily.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontPitch.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontSlant.hpp>
30*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontStrikeout.hpp>
31*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontType.hpp>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontWeight.hpp>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/FontUnderline.hpp>
34*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XDevice.hpp>
35*b1cdbd2cSJim Jagielski #include <com/sun/star/awt/XFont2.hpp>
36*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XIndexAccess.hpp>
37*b1cdbd2cSJim Jagielski #include <com/sun/star/container/XNameAccess.hpp>
38*b1cdbd2cSJim Jagielski #include <com/sun/star/style/XStyle.hpp>
39*b1cdbd2cSJim Jagielski #include <com/sun/star/text/WritingMode2.hpp>
40*b1cdbd2cSJim Jagielski #include <com/sun/star/text/XText.hpp>
41*b1cdbd2cSJim Jagielski #include <rtl/tencinfo.h>
42*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
43*b1cdbd2cSJim Jagielski #include "oox/core/filterbase.hxx"
44*b1cdbd2cSJim Jagielski #include "oox/helper/attributelist.hxx"
45*b1cdbd2cSJim Jagielski #include "oox/helper/containerhelper.hxx"
46*b1cdbd2cSJim Jagielski #include "oox/helper/propertymap.hxx"
47*b1cdbd2cSJim Jagielski #include "oox/helper/propertyset.hxx"
48*b1cdbd2cSJim Jagielski #include "oox/xls/biffinputstream.hxx"
49*b1cdbd2cSJim Jagielski #include "oox/xls/condformatbuffer.hxx"
50*b1cdbd2cSJim Jagielski #include "oox/xls/excelhandlers.hxx"
51*b1cdbd2cSJim Jagielski #include "oox/xls/themebuffer.hxx"
52*b1cdbd2cSJim Jagielski #include "oox/xls/unitconverter.hxx"
53*b1cdbd2cSJim Jagielski
54*b1cdbd2cSJim Jagielski namespace oox {
55*b1cdbd2cSJim Jagielski namespace xls {
56*b1cdbd2cSJim Jagielski
57*b1cdbd2cSJim Jagielski // ============================================================================
58*b1cdbd2cSJim Jagielski
59*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::awt;
60*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::container;
61*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::style;
62*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::table;
63*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::text;
64*b1cdbd2cSJim Jagielski using namespace ::com::sun::star::uno;
65*b1cdbd2cSJim Jagielski
66*b1cdbd2cSJim Jagielski using ::oox::core::FilterBase;
67*b1cdbd2cSJim Jagielski using ::rtl::OUString;
68*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
69*b1cdbd2cSJim Jagielski
70*b1cdbd2cSJim Jagielski // ============================================================================
71*b1cdbd2cSJim Jagielski
72*b1cdbd2cSJim Jagielski namespace {
73*b1cdbd2cSJim Jagielski
74*b1cdbd2cSJim Jagielski // OOXML constants ------------------------------------------------------------
75*b1cdbd2cSJim Jagielski
76*b1cdbd2cSJim Jagielski // OOXML predefined color indexes (also used in BIFF3-BIFF8)
77*b1cdbd2cSJim Jagielski const sal_Int32 OOX_COLOR_USEROFFSET = 0; /// First user defined color in palette (OOXML/BIFF12).
78*b1cdbd2cSJim Jagielski const sal_Int32 BIFF_COLOR_USEROFFSET = 8; /// First user defined color in palette (BIFF3-BIFF8).
79*b1cdbd2cSJim Jagielski
80*b1cdbd2cSJim Jagielski // OOXML font family (also used in BIFF)
81*b1cdbd2cSJim Jagielski const sal_Int32 OOX_FONTFAMILY_NONE = 0;
82*b1cdbd2cSJim Jagielski const sal_Int32 OOX_FONTFAMILY_ROMAN = 1;
83*b1cdbd2cSJim Jagielski const sal_Int32 OOX_FONTFAMILY_SWISS = 2;
84*b1cdbd2cSJim Jagielski const sal_Int32 OOX_FONTFAMILY_MODERN = 3;
85*b1cdbd2cSJim Jagielski const sal_Int32 OOX_FONTFAMILY_SCRIPT = 4;
86*b1cdbd2cSJim Jagielski const sal_Int32 OOX_FONTFAMILY_DECORATIVE = 5;
87*b1cdbd2cSJim Jagielski
88*b1cdbd2cSJim Jagielski // OOXML cell text direction (also used in BIFF)
89*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_TEXTDIR_CONTEXT = 0;
90*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_TEXTDIR_LTR = 1;
91*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_TEXTDIR_RTL = 2;
92*b1cdbd2cSJim Jagielski
93*b1cdbd2cSJim Jagielski // OOXML cell rotation (also used in BIFF)
94*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_ROTATION_NONE = 0;
95*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_ROTATION_90CCW = 90;
96*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_ROTATION_90CW = 180;
97*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_ROTATION_STACKED = 255;
98*b1cdbd2cSJim Jagielski
99*b1cdbd2cSJim Jagielski // OOXML cell indentation
100*b1cdbd2cSJim Jagielski const sal_Int32 OOX_XF_INDENT_NONE = 0;
101*b1cdbd2cSJim Jagielski
102*b1cdbd2cSJim Jagielski // OOXML built-in cell styles (also used in BIFF)
103*b1cdbd2cSJim Jagielski const sal_Int32 OOX_STYLE_NORMAL = 0; /// Default cell style.
104*b1cdbd2cSJim Jagielski const sal_Int32 OOX_STYLE_ROWLEVEL = 1; /// RowLevel_x cell style.
105*b1cdbd2cSJim Jagielski const sal_Int32 OOX_STYLE_COLLEVEL = 2; /// ColLevel_x cell style.
106*b1cdbd2cSJim Jagielski
107*b1cdbd2cSJim Jagielski const sal_Int32 OOX_STYLE_LEVELCOUNT = 7; /// Number of outline level styles.
108*b1cdbd2cSJim Jagielski
109*b1cdbd2cSJim Jagielski // BIFF12 constants -----------------------------------------------------------
110*b1cdbd2cSJim Jagielski
111*b1cdbd2cSJim Jagielski // BIFF12 color types
112*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF12_COLOR_AUTO = 0;
113*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF12_COLOR_INDEXED = 1;
114*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF12_COLOR_RGB = 2;
115*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF12_COLOR_THEME = 3;
116*b1cdbd2cSJim Jagielski
117*b1cdbd2cSJim Jagielski // BIFF12 diagonal borders
118*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF12_BORDER_DIAG_TLBR = 0x01; /// Top-left to bottom-right.
119*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF12_BORDER_DIAG_BLTR = 0x02; /// Bottom-left to top-right.
120*b1cdbd2cSJim Jagielski
121*b1cdbd2cSJim Jagielski // BIFF12 gradient fill
122*b1cdbd2cSJim Jagielski const sal_Int32 BIFF12_FILL_GRADIENT = 40;
123*b1cdbd2cSJim Jagielski
124*b1cdbd2cSJim Jagielski // BIFF12 XF flags
125*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF12_XF_WRAPTEXT = 0x00400000;
126*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF12_XF_JUSTLASTLINE = 0x00800000;
127*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF12_XF_SHRINK = 0x01000000;
128*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF12_XF_LOCKED = 0x10000000;
129*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF12_XF_HIDDEN = 0x20000000;
130*b1cdbd2cSJim Jagielski
131*b1cdbd2cSJim Jagielski // BIFF12 XF attribute used flags
132*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_XF_NUMFMT_USED = 0x0001;
133*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_XF_FONT_USED = 0x0002;
134*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_XF_ALIGN_USED = 0x0004;
135*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_XF_BORDER_USED = 0x0008;
136*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_XF_AREA_USED = 0x0010;
137*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_XF_PROT_USED = 0x0020;
138*b1cdbd2cSJim Jagielski
139*b1cdbd2cSJim Jagielski // BIFF12 DXF constants
140*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FILL_PATTERN = 0;
141*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FILL_FGCOLOR = 1;
142*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FILL_BGCOLOR = 2;
143*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FILL_GRADIENT = 3;
144*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FILL_STOP = 4;
145*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_COLOR = 5;
146*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_TOP = 6;
147*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_BOTTOM = 7;
148*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_LEFT = 8;
149*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_RIGHT = 9;
150*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_DIAG = 10;
151*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_VERT = 11;
152*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_HOR = 12;
153*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_DIAGUP = 13;
154*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_BORDER_DIAGDOWN = 14;
155*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_NAME = 24;
156*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_WEIGHT = 25;
157*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_UNDERLINE = 26;
158*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_ESCAPEMENT = 27;
159*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_ITALIC = 28;
160*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_STRIKE = 29;
161*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_OUTLINE = 30;
162*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_SHADOW = 31;
163*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_CONDENSE = 32;
164*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_EXTEND = 33;
165*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_CHARSET = 34;
166*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_FAMILY = 35;
167*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_HEIGHT = 36;
168*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_FONT_SCHEME = 37;
169*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_NUMFMT_CODE = 38;
170*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_DXF_NUMFMT_ID = 41;
171*b1cdbd2cSJim Jagielski
172*b1cdbd2cSJim Jagielski // BIFF12 CELLSTYLE flags
173*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_CELLSTYLE_BUILTIN = 0x0001;
174*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_CELLSTYLE_HIDDEN = 0x0002;
175*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF12_CELLSTYLE_CUSTOM = 0x0004;
176*b1cdbd2cSJim Jagielski
177*b1cdbd2cSJim Jagielski // BIFF constants -------------------------------------------------------------
178*b1cdbd2cSJim Jagielski
179*b1cdbd2cSJim Jagielski // BIFF predefined color indexes
180*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF2_COLOR_BLACK = 0; /// Black (text) in BIFF2.
181*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF2_COLOR_WHITE = 1; /// White (background) in BIFF2.
182*b1cdbd2cSJim Jagielski
183*b1cdbd2cSJim Jagielski // BIFF font flags, also used in BIFF12
184*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_BOLD = 0x0001;
185*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_ITALIC = 0x0002;
186*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_UNDERLINE = 0x0004;
187*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_STRIKEOUT = 0x0008;
188*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_OUTLINE = 0x0010;
189*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_SHADOW = 0x0020;
190*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTFLAG_CONDENSE = 0x0040;
191*b1cdbd2cSJim Jagielski
192*b1cdbd2cSJim Jagielski // BIFF font weight
193*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_FONTWEIGHT_BOLD = 450;
194*b1cdbd2cSJim Jagielski
195*b1cdbd2cSJim Jagielski // BIFF font underline, also used in BIFF12
196*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_FONTUNDERL_NONE = 0;
197*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_FONTUNDERL_SINGLE = 1;
198*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_FONTUNDERL_DOUBLE = 2;
199*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_FONTUNDERL_SINGLE_ACC = 33;
200*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_FONTUNDERL_DOUBLE_ACC = 34;
201*b1cdbd2cSJim Jagielski
202*b1cdbd2cSJim Jagielski // BIFF XF flags
203*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_LOCKED = 0x0001;
204*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_HIDDEN = 0x0002;
205*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_STYLE = 0x0004;
206*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_STYLEPARENT = 0x0FFF; /// Syles don't have a parent.
207*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_WRAPTEXT = 0x0008; /// Automatic line break.
208*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_JUSTLASTLINE = 0x0080;
209*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_SHRINK = 0x0010; /// Shrink to fit into cell.
210*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_XF_MERGE = 0x0020;
211*b1cdbd2cSJim Jagielski
212*b1cdbd2cSJim Jagielski // BIFF XF attribute used flags
213*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_NUMFMT_USED = 0x01;
214*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_FONT_USED = 0x02;
215*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_ALIGN_USED = 0x04;
216*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_BORDER_USED = 0x08;
217*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_AREA_USED = 0x10;
218*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_PROT_USED = 0x20;
219*b1cdbd2cSJim Jagielski
220*b1cdbd2cSJim Jagielski // BIFF XF text orientation
221*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_ORIENT_NONE = 0;
222*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_ORIENT_STACKED = 1; /// Stacked top to bottom.
223*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_ORIENT_90CCW = 2; /// 90 degr. counterclockwise.
224*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_XF_ORIENT_90CW = 3; /// 90 degr. clockwise.
225*b1cdbd2cSJim Jagielski
226*b1cdbd2cSJim Jagielski // BIFF XF line styles
227*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_LINE_NONE = 0;
228*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_LINE_THIN = 1;
229*b1cdbd2cSJim Jagielski
230*b1cdbd2cSJim Jagielski // BIFF XF patterns
231*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_PATT_NONE = 0;
232*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_PATT_125 = 17;
233*b1cdbd2cSJim Jagielski
234*b1cdbd2cSJim Jagielski // BIFF2 XF flags
235*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_VALFMT_MASK = 0x3F;
236*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_LOCKED = 0x40;
237*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_HIDDEN = 0x80;
238*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_LEFTLINE = 0x08;
239*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_RIGHTLINE = 0x10;
240*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_TOPLINE = 0x20;
241*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_BOTTOMLINE = 0x40;
242*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF2_XF_BACKGROUND = 0x80;
243*b1cdbd2cSJim Jagielski
244*b1cdbd2cSJim Jagielski // BIFF8 diagonal borders
245*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_XF_DIAG_TLBR = 0x40000000; /// Top-left to bottom-right.
246*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_XF_DIAG_BLTR = 0x80000000; /// Bottom-left to top-right.
247*b1cdbd2cSJim Jagielski
248*b1cdbd2cSJim Jagielski // BIFF STYLE flags
249*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_STYLE_BUILTIN = 0x8000;
250*b1cdbd2cSJim Jagielski const sal_uInt16 BIFF_STYLE_XFMASK = 0x0FFF;
251*b1cdbd2cSJim Jagielski
252*b1cdbd2cSJim Jagielski // BIFF STYLEEXT flags
253*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_STYLEEXT_BUILTIN = 0x01;
254*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_STYLEEXT_HIDDEN = 0x02;
255*b1cdbd2cSJim Jagielski const sal_uInt8 BIFF_STYLEEXT_CUSTOM = 0x04;
256*b1cdbd2cSJim Jagielski
257*b1cdbd2cSJim Jagielski // BIFF conditional formatting
258*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_BORDER_LEFT = 0x00000400;
259*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_BORDER_RIGHT = 0x00000800;
260*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_BORDER_TOP = 0x00001000;
261*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_BORDER_BOTTOM = 0x00002000;
262*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FILL_PATTERN = 0x00010000;
263*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FILL_PATTCOLOR = 0x00020000;
264*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FILL_FILLCOLOR = 0x00040000;
265*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONTBLOCK = 0x04000000;
266*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_ALIGNBLOCK = 0x08000000;
267*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_BORDERBLOCK = 0x10000000;
268*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FILLBLOCK = 0x20000000;
269*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_PROTBLOCK = 0x40000000;
270*b1cdbd2cSJim Jagielski
271*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONT_STYLE = 0x00000002; /// Font posture or weight modified?
272*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONT_OUTLINE = 0x00000008; /// Font outline modified?
273*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONT_SHADOW = 0x00000010; /// Font shadow modified?
274*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONT_STRIKEOUT = 0x00000080; /// Font cancellation modified?
275*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONT_UNDERL = 0x00000001; /// Font underline type modified?
276*b1cdbd2cSJim Jagielski const sal_uInt32 BIFF_CFRULE_FONT_ESCAPEM = 0x00000001; /// Font escapement type modified?
277*b1cdbd2cSJim Jagielski
278*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
279*b1cdbd2cSJim Jagielski
lclReadRgbColor(BinaryInputStream & rStrm)280*b1cdbd2cSJim Jagielski sal_Int32 lclReadRgbColor( BinaryInputStream& rStrm )
281*b1cdbd2cSJim Jagielski {
282*b1cdbd2cSJim Jagielski sal_uInt8 nR, nG, nB, nA;
283*b1cdbd2cSJim Jagielski rStrm >> nR >> nG >> nB >> nA;
284*b1cdbd2cSJim Jagielski sal_Int32 nValue = nA;
285*b1cdbd2cSJim Jagielski nValue <<= 8;
286*b1cdbd2cSJim Jagielski nValue |= nR;
287*b1cdbd2cSJim Jagielski nValue <<= 8;
288*b1cdbd2cSJim Jagielski nValue |= nG;
289*b1cdbd2cSJim Jagielski nValue <<= 8;
290*b1cdbd2cSJim Jagielski nValue |= nB;
291*b1cdbd2cSJim Jagielski return nValue;
292*b1cdbd2cSJim Jagielski }
293*b1cdbd2cSJim Jagielski
294*b1cdbd2cSJim Jagielski } // namespace
295*b1cdbd2cSJim Jagielski
296*b1cdbd2cSJim Jagielski // ============================================================================
297*b1cdbd2cSJim Jagielski
ExcelGraphicHelper(const WorkbookHelper & rHelper)298*b1cdbd2cSJim Jagielski ExcelGraphicHelper::ExcelGraphicHelper( const WorkbookHelper& rHelper ) :
299*b1cdbd2cSJim Jagielski GraphicHelper( rHelper.getBaseFilter().getComponentContext(), rHelper.getBaseFilter().getTargetFrame(), rHelper.getBaseFilter().getStorage() ),
300*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper )
301*b1cdbd2cSJim Jagielski {
302*b1cdbd2cSJim Jagielski }
303*b1cdbd2cSJim Jagielski
getSchemeColor(sal_Int32 nToken) const304*b1cdbd2cSJim Jagielski sal_Int32 ExcelGraphicHelper::getSchemeColor( sal_Int32 nToken ) const
305*b1cdbd2cSJim Jagielski {
306*b1cdbd2cSJim Jagielski if( getFilterType() == FILTER_OOXML )
307*b1cdbd2cSJim Jagielski return getTheme().getColorByToken( nToken );
308*b1cdbd2cSJim Jagielski return GraphicHelper::getSchemeColor( nToken );
309*b1cdbd2cSJim Jagielski }
310*b1cdbd2cSJim Jagielski
getPaletteColor(sal_Int32 nPaletteIdx) const311*b1cdbd2cSJim Jagielski sal_Int32 ExcelGraphicHelper::getPaletteColor( sal_Int32 nPaletteIdx ) const
312*b1cdbd2cSJim Jagielski {
313*b1cdbd2cSJim Jagielski return getStyles().getPaletteColor( nPaletteIdx );
314*b1cdbd2cSJim Jagielski }
315*b1cdbd2cSJim Jagielski
316*b1cdbd2cSJim Jagielski // ============================================================================
317*b1cdbd2cSJim Jagielski
setAuto()318*b1cdbd2cSJim Jagielski void Color::setAuto()
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski clearTransformations();
321*b1cdbd2cSJim Jagielski setSchemeClr( XML_phClr );
322*b1cdbd2cSJim Jagielski }
323*b1cdbd2cSJim Jagielski
setRgb(sal_Int32 nRgbValue,double fTint)324*b1cdbd2cSJim Jagielski void Color::setRgb( sal_Int32 nRgbValue, double fTint )
325*b1cdbd2cSJim Jagielski {
326*b1cdbd2cSJim Jagielski clearTransformations();
327*b1cdbd2cSJim Jagielski setSrgbClr( nRgbValue & 0xFFFFFF );
328*b1cdbd2cSJim Jagielski if( fTint != 0.0 ) addExcelTintTransformation( fTint );
329*b1cdbd2cSJim Jagielski }
330*b1cdbd2cSJim Jagielski
setTheme(sal_Int32 nThemeIdx,double fTint)331*b1cdbd2cSJim Jagielski void Color::setTheme( sal_Int32 nThemeIdx, double fTint )
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski clearTransformations();
334*b1cdbd2cSJim Jagielski static const sal_Int32 spnColorTokens[] = {
335*b1cdbd2cSJim Jagielski XML_lt1, XML_dk1, XML_lt2, XML_dk2, XML_accent1, XML_accent2,
336*b1cdbd2cSJim Jagielski XML_accent3, XML_accent4, XML_accent5, XML_accent6, XML_hlink, XML_folHlink };
337*b1cdbd2cSJim Jagielski setSchemeClr( STATIC_ARRAY_SELECT( spnColorTokens, nThemeIdx, XML_TOKEN_INVALID ) );
338*b1cdbd2cSJim Jagielski if( fTint != 0.0 ) addExcelTintTransformation( fTint );
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski
setIndexed(sal_Int32 nPaletteIdx,double fTint)341*b1cdbd2cSJim Jagielski void Color::setIndexed( sal_Int32 nPaletteIdx, double fTint )
342*b1cdbd2cSJim Jagielski {
343*b1cdbd2cSJim Jagielski clearTransformations();
344*b1cdbd2cSJim Jagielski setPaletteClr( nPaletteIdx );
345*b1cdbd2cSJim Jagielski if( fTint != 0.0 ) addExcelTintTransformation( fTint );
346*b1cdbd2cSJim Jagielski }
347*b1cdbd2cSJim Jagielski
importColor(const AttributeList & rAttribs)348*b1cdbd2cSJim Jagielski void Color::importColor( const AttributeList& rAttribs )
349*b1cdbd2cSJim Jagielski {
350*b1cdbd2cSJim Jagielski if( rAttribs.getBool( XML_auto, false ) )
351*b1cdbd2cSJim Jagielski setAuto();
352*b1cdbd2cSJim Jagielski else if( rAttribs.hasAttribute( XML_rgb ) )
353*b1cdbd2cSJim Jagielski setRgb( rAttribs.getIntegerHex( XML_rgb, API_RGB_TRANSPARENT ), rAttribs.getDouble( XML_tint, 0.0 ) );
354*b1cdbd2cSJim Jagielski else if( rAttribs.hasAttribute( XML_theme ) )
355*b1cdbd2cSJim Jagielski setTheme( rAttribs.getInteger( XML_theme, -1 ), rAttribs.getDouble( XML_tint, 0.0 ) );
356*b1cdbd2cSJim Jagielski else if( rAttribs.hasAttribute( XML_indexed ) )
357*b1cdbd2cSJim Jagielski setIndexed( rAttribs.getInteger( XML_indexed, -1 ), rAttribs.getDouble( XML_tint, 0.0 ) );
358*b1cdbd2cSJim Jagielski else
359*b1cdbd2cSJim Jagielski {
360*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "Color::importColor - unknown color type" );
361*b1cdbd2cSJim Jagielski setAuto();
362*b1cdbd2cSJim Jagielski }
363*b1cdbd2cSJim Jagielski }
364*b1cdbd2cSJim Jagielski
importColor(SequenceInputStream & rStrm)365*b1cdbd2cSJim Jagielski void Color::importColor( SequenceInputStream& rStrm )
366*b1cdbd2cSJim Jagielski {
367*b1cdbd2cSJim Jagielski sal_uInt8 nFlags, nIndex;
368*b1cdbd2cSJim Jagielski sal_Int16 nTint;
369*b1cdbd2cSJim Jagielski rStrm >> nFlags >> nIndex >> nTint;
370*b1cdbd2cSJim Jagielski
371*b1cdbd2cSJim Jagielski // scale tint from signed 16-bit to double range -1.0 ... 1.0
372*b1cdbd2cSJim Jagielski double fTint = nTint;
373*b1cdbd2cSJim Jagielski if( nTint < 0 )
374*b1cdbd2cSJim Jagielski fTint /= -SAL_MIN_INT16;
375*b1cdbd2cSJim Jagielski else if( nTint > 0 )
376*b1cdbd2cSJim Jagielski fTint /= SAL_MAX_INT16;
377*b1cdbd2cSJim Jagielski
378*b1cdbd2cSJim Jagielski switch( extractValue< sal_uInt8 >( nFlags, 1, 7 ) )
379*b1cdbd2cSJim Jagielski {
380*b1cdbd2cSJim Jagielski case BIFF12_COLOR_AUTO:
381*b1cdbd2cSJim Jagielski setAuto();
382*b1cdbd2cSJim Jagielski rStrm.skip( 4 );
383*b1cdbd2cSJim Jagielski break;
384*b1cdbd2cSJim Jagielski case BIFF12_COLOR_INDEXED:
385*b1cdbd2cSJim Jagielski setIndexed( nIndex, fTint );
386*b1cdbd2cSJim Jagielski rStrm.skip( 4 );
387*b1cdbd2cSJim Jagielski break;
388*b1cdbd2cSJim Jagielski case BIFF12_COLOR_RGB:
389*b1cdbd2cSJim Jagielski setRgb( lclReadRgbColor( rStrm ), fTint );
390*b1cdbd2cSJim Jagielski break;
391*b1cdbd2cSJim Jagielski case BIFF12_COLOR_THEME:
392*b1cdbd2cSJim Jagielski setTheme( nIndex, fTint );
393*b1cdbd2cSJim Jagielski rStrm.skip( 4 );
394*b1cdbd2cSJim Jagielski break;
395*b1cdbd2cSJim Jagielski default:
396*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "Color::importColor - unknown color type" );
397*b1cdbd2cSJim Jagielski setAuto();
398*b1cdbd2cSJim Jagielski rStrm.skip( 4 );
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski
importColorId(SequenceInputStream & rStrm)402*b1cdbd2cSJim Jagielski void Color::importColorId( SequenceInputStream& rStrm )
403*b1cdbd2cSJim Jagielski {
404*b1cdbd2cSJim Jagielski setIndexed( rStrm.readInt32() );
405*b1cdbd2cSJim Jagielski }
406*b1cdbd2cSJim Jagielski
importColorRgb(SequenceInputStream & rStrm)407*b1cdbd2cSJim Jagielski void Color::importColorRgb( SequenceInputStream& rStrm )
408*b1cdbd2cSJim Jagielski {
409*b1cdbd2cSJim Jagielski setRgb( lclReadRgbColor( rStrm ) );
410*b1cdbd2cSJim Jagielski }
411*b1cdbd2cSJim Jagielski
importColorId(BiffInputStream & rStrm,bool b16Bit)412*b1cdbd2cSJim Jagielski void Color::importColorId( BiffInputStream& rStrm, bool b16Bit )
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski setIndexed( b16Bit ? rStrm.readuInt16() : rStrm.readuInt8() );
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski
importColorRgb(BiffInputStream & rStrm)417*b1cdbd2cSJim Jagielski void Color::importColorRgb( BiffInputStream& rStrm )
418*b1cdbd2cSJim Jagielski {
419*b1cdbd2cSJim Jagielski setRgb( lclReadRgbColor( rStrm ) );
420*b1cdbd2cSJim Jagielski }
421*b1cdbd2cSJim Jagielski
operator >>(SequenceInputStream & rStrm,Color & orColor)422*b1cdbd2cSJim Jagielski SequenceInputStream& operator>>( SequenceInputStream& rStrm, Color& orColor )
423*b1cdbd2cSJim Jagielski {
424*b1cdbd2cSJim Jagielski orColor.importColor( rStrm );
425*b1cdbd2cSJim Jagielski return rStrm;
426*b1cdbd2cSJim Jagielski }
427*b1cdbd2cSJim Jagielski
428*b1cdbd2cSJim Jagielski // ============================================================================
429*b1cdbd2cSJim Jagielski
430*b1cdbd2cSJim Jagielski namespace {
431*b1cdbd2cSJim Jagielski
432*b1cdbd2cSJim Jagielski /** Standard EGA colors, bright. */
433*b1cdbd2cSJim Jagielski #define PALETTE_EGA_COLORS_LIGHT \
434*b1cdbd2cSJim Jagielski 0x000000, 0xFFFFFF, 0xFF0000, 0x00FF00, 0x0000FF, 0xFFFF00, 0xFF00FF, 0x00FFFF
435*b1cdbd2cSJim Jagielski /** Standard EGA colors, dark. */
436*b1cdbd2cSJim Jagielski #define PALETTE_EGA_COLORS_DARK \
437*b1cdbd2cSJim Jagielski 0x800000, 0x008000, 0x000080, 0x808000, 0x800080, 0x008080, 0xC0C0C0, 0x808080
438*b1cdbd2cSJim Jagielski
439*b1cdbd2cSJim Jagielski /** Default color table for BIFF2. */
440*b1cdbd2cSJim Jagielski static const sal_Int32 spnDefColors2[] =
441*b1cdbd2cSJim Jagielski {
442*b1cdbd2cSJim Jagielski /* 0 */ PALETTE_EGA_COLORS_LIGHT
443*b1cdbd2cSJim Jagielski };
444*b1cdbd2cSJim Jagielski
445*b1cdbd2cSJim Jagielski /** Default color table for BIFF3/BIFF4. */
446*b1cdbd2cSJim Jagielski static const sal_Int32 spnDefColors3[] =
447*b1cdbd2cSJim Jagielski {
448*b1cdbd2cSJim Jagielski /* 0 */ PALETTE_EGA_COLORS_LIGHT,
449*b1cdbd2cSJim Jagielski /* 8 */ PALETTE_EGA_COLORS_LIGHT,
450*b1cdbd2cSJim Jagielski /* 16 */ PALETTE_EGA_COLORS_DARK
451*b1cdbd2cSJim Jagielski };
452*b1cdbd2cSJim Jagielski
453*b1cdbd2cSJim Jagielski /** Default color table for BIFF5. */
454*b1cdbd2cSJim Jagielski static const sal_Int32 spnDefColors5[] =
455*b1cdbd2cSJim Jagielski {
456*b1cdbd2cSJim Jagielski /* 0 */ PALETTE_EGA_COLORS_LIGHT,
457*b1cdbd2cSJim Jagielski /* 8 */ PALETTE_EGA_COLORS_LIGHT,
458*b1cdbd2cSJim Jagielski /* 16 */ PALETTE_EGA_COLORS_DARK,
459*b1cdbd2cSJim Jagielski /* 24 */ 0x8080FF, 0x802060, 0xFFFFC0, 0xA0E0E0, 0x600080, 0xFF8080, 0x0080C0, 0xC0C0FF,
460*b1cdbd2cSJim Jagielski /* 32 */ 0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF,
461*b1cdbd2cSJim Jagielski /* 40 */ 0x00CFFF, 0x69FFFF, 0xE0FFE0, 0xFFFF80, 0xA6CAF0, 0xDD9CB3, 0xB38FEE, 0xE3E3E3,
462*b1cdbd2cSJim Jagielski /* 48 */ 0x2A6FF9, 0x3FB8CD, 0x488436, 0x958C41, 0x8E5E42, 0xA0627A, 0x624FAC, 0x969696,
463*b1cdbd2cSJim Jagielski /* 56 */ 0x1D2FBE, 0x286676, 0x004500, 0x453E01, 0x6A2813, 0x85396A, 0x4A3285, 0x424242
464*b1cdbd2cSJim Jagielski };
465*b1cdbd2cSJim Jagielski
466*b1cdbd2cSJim Jagielski /** Default color table for BIFF8/BIFF12/OOXML. */
467*b1cdbd2cSJim Jagielski static const sal_Int32 spnDefColors8[] =
468*b1cdbd2cSJim Jagielski {
469*b1cdbd2cSJim Jagielski /* 0 */ PALETTE_EGA_COLORS_LIGHT,
470*b1cdbd2cSJim Jagielski /* 8 */ PALETTE_EGA_COLORS_LIGHT,
471*b1cdbd2cSJim Jagielski /* 16 */ PALETTE_EGA_COLORS_DARK,
472*b1cdbd2cSJim Jagielski /* 24 */ 0x9999FF, 0x993366, 0xFFFFCC, 0xCCFFFF, 0x660066, 0xFF8080, 0x0066CC, 0xCCCCFF,
473*b1cdbd2cSJim Jagielski /* 32 */ 0x000080, 0xFF00FF, 0xFFFF00, 0x00FFFF, 0x800080, 0x800000, 0x008080, 0x0000FF,
474*b1cdbd2cSJim Jagielski /* 40 */ 0x00CCFF, 0xCCFFFF, 0xCCFFCC, 0xFFFF99, 0x99CCFF, 0xFF99CC, 0xCC99FF, 0xFFCC99,
475*b1cdbd2cSJim Jagielski /* 48 */ 0x3366FF, 0x33CCCC, 0x99CC00, 0xFFCC00, 0xFF9900, 0xFF6600, 0x666699, 0x969696,
476*b1cdbd2cSJim Jagielski /* 56 */ 0x003366, 0x339966, 0x003300, 0x333300, 0x993300, 0x993366, 0x333399, 0x333333
477*b1cdbd2cSJim Jagielski };
478*b1cdbd2cSJim Jagielski
479*b1cdbd2cSJim Jagielski #undef PALETTE_EGA_COLORS_LIGHT
480*b1cdbd2cSJim Jagielski #undef PALETTE_EGA_COLORS_DARK
481*b1cdbd2cSJim Jagielski
482*b1cdbd2cSJim Jagielski } // namespace
483*b1cdbd2cSJim Jagielski
484*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
485*b1cdbd2cSJim Jagielski
ColorPalette(const WorkbookHelper & rHelper)486*b1cdbd2cSJim Jagielski ColorPalette::ColorPalette( const WorkbookHelper& rHelper ) :
487*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper )
488*b1cdbd2cSJim Jagielski {
489*b1cdbd2cSJim Jagielski // default colors
490*b1cdbd2cSJim Jagielski switch( getFilterType() )
491*b1cdbd2cSJim Jagielski {
492*b1cdbd2cSJim Jagielski case FILTER_OOXML:
493*b1cdbd2cSJim Jagielski maColors.insert( maColors.begin(), spnDefColors8, STATIC_ARRAY_END( spnDefColors8 ) );
494*b1cdbd2cSJim Jagielski mnAppendIndex = OOX_COLOR_USEROFFSET;
495*b1cdbd2cSJim Jagielski break;
496*b1cdbd2cSJim Jagielski case FILTER_BIFF:
497*b1cdbd2cSJim Jagielski switch( getBiff() )
498*b1cdbd2cSJim Jagielski {
499*b1cdbd2cSJim Jagielski case BIFF2: maColors.insert( maColors.begin(), spnDefColors2, STATIC_ARRAY_END( spnDefColors2 ) ); break;
500*b1cdbd2cSJim Jagielski case BIFF3:
501*b1cdbd2cSJim Jagielski case BIFF4: maColors.insert( maColors.begin(), spnDefColors3, STATIC_ARRAY_END( spnDefColors3 ) ); break;
502*b1cdbd2cSJim Jagielski case BIFF5: maColors.insert( maColors.begin(), spnDefColors5, STATIC_ARRAY_END( spnDefColors5 ) ); break;
503*b1cdbd2cSJim Jagielski case BIFF8: maColors.insert( maColors.begin(), spnDefColors8, STATIC_ARRAY_END( spnDefColors8 ) ); break;
504*b1cdbd2cSJim Jagielski case BIFF_UNKNOWN: break;
505*b1cdbd2cSJim Jagielski }
506*b1cdbd2cSJim Jagielski mnAppendIndex = BIFF_COLOR_USEROFFSET;
507*b1cdbd2cSJim Jagielski break;
508*b1cdbd2cSJim Jagielski case FILTER_UNKNOWN: break;
509*b1cdbd2cSJim Jagielski }
510*b1cdbd2cSJim Jagielski }
511*b1cdbd2cSJim Jagielski
importPaletteColor(const AttributeList & rAttribs)512*b1cdbd2cSJim Jagielski void ColorPalette::importPaletteColor( const AttributeList& rAttribs )
513*b1cdbd2cSJim Jagielski {
514*b1cdbd2cSJim Jagielski appendColor( rAttribs.getIntegerHex( XML_rgb, API_RGB_WHITE ) );
515*b1cdbd2cSJim Jagielski }
516*b1cdbd2cSJim Jagielski
importPaletteColor(SequenceInputStream & rStrm)517*b1cdbd2cSJim Jagielski void ColorPalette::importPaletteColor( SequenceInputStream& rStrm )
518*b1cdbd2cSJim Jagielski {
519*b1cdbd2cSJim Jagielski sal_Int32 nRgb = lclReadRgbColor( rStrm );
520*b1cdbd2cSJim Jagielski appendColor( nRgb & 0xFFFFFF );
521*b1cdbd2cSJim Jagielski }
522*b1cdbd2cSJim Jagielski
importPalette(BiffInputStream & rStrm)523*b1cdbd2cSJim Jagielski void ColorPalette::importPalette( BiffInputStream& rStrm )
524*b1cdbd2cSJim Jagielski {
525*b1cdbd2cSJim Jagielski sal_uInt16 nCount;
526*b1cdbd2cSJim Jagielski rStrm >> nCount;
527*b1cdbd2cSJim Jagielski OSL_ENSURE( rStrm.getRemaining() == 4 * nCount, "ColorPalette::importPalette - wrong palette size" );
528*b1cdbd2cSJim Jagielski
529*b1cdbd2cSJim Jagielski // fill palette from BIFF_COLOR_USEROFFSET
530*b1cdbd2cSJim Jagielski mnAppendIndex = BIFF_COLOR_USEROFFSET;
531*b1cdbd2cSJim Jagielski for( sal_uInt16 nIndex = 0; !rStrm.isEof() && (nIndex < nCount); ++nIndex )
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski sal_Int32 nRgb = lclReadRgbColor( rStrm );
534*b1cdbd2cSJim Jagielski appendColor( nRgb & 0xFFFFFF );
535*b1cdbd2cSJim Jagielski }
536*b1cdbd2cSJim Jagielski }
537*b1cdbd2cSJim Jagielski
importPalette(const Any & rPalette)538*b1cdbd2cSJim Jagielski void ColorPalette::importPalette( const Any& rPalette )
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski Sequence< sal_Int32 > rColorSeq;
541*b1cdbd2cSJim Jagielski if( (rPalette >>= rColorSeq) && rColorSeq.hasElements() )
542*b1cdbd2cSJim Jagielski {
543*b1cdbd2cSJim Jagielski const sal_Int32* pnColor = rColorSeq.getConstArray();
544*b1cdbd2cSJim Jagielski const sal_Int32* pnColorEnd = pnColor + rColorSeq.getLength();
545*b1cdbd2cSJim Jagielski for( ; pnColor < pnColorEnd; ++pnColor )
546*b1cdbd2cSJim Jagielski appendColor( *pnColor & 0xFFFFFF );
547*b1cdbd2cSJim Jagielski }
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski
getColor(sal_Int32 nPaletteIdx) const550*b1cdbd2cSJim Jagielski sal_Int32 ColorPalette::getColor( sal_Int32 nPaletteIdx ) const
551*b1cdbd2cSJim Jagielski {
552*b1cdbd2cSJim Jagielski sal_Int32 nColor = API_RGB_TRANSPARENT;
553*b1cdbd2cSJim Jagielski if( const sal_Int32* pnPaletteColor = ContainerHelper::getVectorElement( maColors, nPaletteIdx ) )
554*b1cdbd2cSJim Jagielski {
555*b1cdbd2cSJim Jagielski nColor = *pnPaletteColor;
556*b1cdbd2cSJim Jagielski }
557*b1cdbd2cSJim Jagielski else switch( nPaletteIdx )
558*b1cdbd2cSJim Jagielski {
559*b1cdbd2cSJim Jagielski case OOX_COLOR_WINDOWTEXT3:
560*b1cdbd2cSJim Jagielski case OOX_COLOR_WINDOWTEXT:
561*b1cdbd2cSJim Jagielski case OOX_COLOR_CHWINDOWTEXT: nColor = getBaseFilter().getGraphicHelper().getSystemColor( XML_windowText ); break;
562*b1cdbd2cSJim Jagielski case OOX_COLOR_WINDOWBACK3:
563*b1cdbd2cSJim Jagielski case OOX_COLOR_WINDOWBACK:
564*b1cdbd2cSJim Jagielski case OOX_COLOR_CHWINDOWBACK: nColor = getBaseFilter().getGraphicHelper().getSystemColor( XML_window ); break;
565*b1cdbd2cSJim Jagielski case OOX_COLOR_BUTTONBACK: nColor = getBaseFilter().getGraphicHelper().getSystemColor( XML_btnFace ); break;
566*b1cdbd2cSJim Jagielski case OOX_COLOR_CHBORDERAUTO: nColor = API_RGB_BLACK; /* really always black? */ break;
567*b1cdbd2cSJim Jagielski case OOX_COLOR_NOTEBACK: nColor = getBaseFilter().getGraphicHelper().getSystemColor( XML_infoBk ); break;
568*b1cdbd2cSJim Jagielski case OOX_COLOR_NOTETEXT: nColor = getBaseFilter().getGraphicHelper().getSystemColor( XML_infoText ); break;
569*b1cdbd2cSJim Jagielski case OOX_COLOR_FONTAUTO: nColor = API_RGB_TRANSPARENT; break;
570*b1cdbd2cSJim Jagielski default: OSL_ENSURE( false, "ColorPalette::getColor - unknown color index" );
571*b1cdbd2cSJim Jagielski }
572*b1cdbd2cSJim Jagielski return nColor;
573*b1cdbd2cSJim Jagielski }
574*b1cdbd2cSJim Jagielski
appendColor(sal_Int32 nRGBValue)575*b1cdbd2cSJim Jagielski void ColorPalette::appendColor( sal_Int32 nRGBValue )
576*b1cdbd2cSJim Jagielski {
577*b1cdbd2cSJim Jagielski if( mnAppendIndex < maColors.size() )
578*b1cdbd2cSJim Jagielski maColors[ mnAppendIndex ] = nRGBValue;
579*b1cdbd2cSJim Jagielski else
580*b1cdbd2cSJim Jagielski maColors.push_back( nRGBValue );
581*b1cdbd2cSJim Jagielski ++mnAppendIndex;
582*b1cdbd2cSJim Jagielski }
583*b1cdbd2cSJim Jagielski
584*b1cdbd2cSJim Jagielski // ============================================================================
585*b1cdbd2cSJim Jagielski
586*b1cdbd2cSJim Jagielski namespace {
587*b1cdbd2cSJim Jagielski
lclSetFontName(ApiScriptFontName & rFontName,const FontDescriptor & rFontDesc,bool bHasGlyphs)588*b1cdbd2cSJim Jagielski void lclSetFontName( ApiScriptFontName& rFontName, const FontDescriptor& rFontDesc, bool bHasGlyphs )
589*b1cdbd2cSJim Jagielski {
590*b1cdbd2cSJim Jagielski if( bHasGlyphs )
591*b1cdbd2cSJim Jagielski {
592*b1cdbd2cSJim Jagielski rFontName.maName = rFontDesc.Name;
593*b1cdbd2cSJim Jagielski rFontName.mnFamily = rFontDesc.Family;
594*b1cdbd2cSJim Jagielski // API font descriptor contains rtl_TextEncoding constants
595*b1cdbd2cSJim Jagielski rFontName.mnTextEnc = rFontDesc.CharSet;
596*b1cdbd2cSJim Jagielski }
597*b1cdbd2cSJim Jagielski else
598*b1cdbd2cSJim Jagielski {
599*b1cdbd2cSJim Jagielski rFontName = ApiScriptFontName();
600*b1cdbd2cSJim Jagielski }
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski
603*b1cdbd2cSJim Jagielski } // namespace
604*b1cdbd2cSJim Jagielski
605*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
606*b1cdbd2cSJim Jagielski
FontModel()607*b1cdbd2cSJim Jagielski FontModel::FontModel() :
608*b1cdbd2cSJim Jagielski mnScheme( XML_none ),
609*b1cdbd2cSJim Jagielski mnFamily( OOX_FONTFAMILY_NONE ),
610*b1cdbd2cSJim Jagielski mnCharSet( WINDOWS_CHARSET_DEFAULT ),
611*b1cdbd2cSJim Jagielski mfHeight( 0.0 ),
612*b1cdbd2cSJim Jagielski mnUnderline( XML_none ),
613*b1cdbd2cSJim Jagielski mnEscapement( XML_baseline ),
614*b1cdbd2cSJim Jagielski mbBold( false ),
615*b1cdbd2cSJim Jagielski mbItalic( false ),
616*b1cdbd2cSJim Jagielski mbStrikeout( false ),
617*b1cdbd2cSJim Jagielski mbOutline( false ),
618*b1cdbd2cSJim Jagielski mbShadow( false )
619*b1cdbd2cSJim Jagielski {
620*b1cdbd2cSJim Jagielski }
621*b1cdbd2cSJim Jagielski
setBiff12Scheme(sal_uInt8 nScheme)622*b1cdbd2cSJim Jagielski void FontModel::setBiff12Scheme( sal_uInt8 nScheme )
623*b1cdbd2cSJim Jagielski {
624*b1cdbd2cSJim Jagielski static const sal_Int32 spnSchemes[] = { XML_none, XML_major, XML_minor };
625*b1cdbd2cSJim Jagielski mnScheme = STATIC_ARRAY_SELECT( spnSchemes, nScheme, XML_none );
626*b1cdbd2cSJim Jagielski }
627*b1cdbd2cSJim Jagielski
setBiffHeight(sal_uInt16 nHeight)628*b1cdbd2cSJim Jagielski void FontModel::setBiffHeight( sal_uInt16 nHeight )
629*b1cdbd2cSJim Jagielski {
630*b1cdbd2cSJim Jagielski mfHeight = nHeight / 20.0; // convert twips to points
631*b1cdbd2cSJim Jagielski }
632*b1cdbd2cSJim Jagielski
setBiffWeight(sal_uInt16 nWeight)633*b1cdbd2cSJim Jagielski void FontModel::setBiffWeight( sal_uInt16 nWeight )
634*b1cdbd2cSJim Jagielski {
635*b1cdbd2cSJim Jagielski mbBold = nWeight >= BIFF_FONTWEIGHT_BOLD;
636*b1cdbd2cSJim Jagielski }
637*b1cdbd2cSJim Jagielski
setBiffUnderline(sal_uInt16 nUnderline)638*b1cdbd2cSJim Jagielski void FontModel::setBiffUnderline( sal_uInt16 nUnderline )
639*b1cdbd2cSJim Jagielski {
640*b1cdbd2cSJim Jagielski switch( nUnderline )
641*b1cdbd2cSJim Jagielski {
642*b1cdbd2cSJim Jagielski case BIFF_FONTUNDERL_NONE: mnUnderline = XML_none; break;
643*b1cdbd2cSJim Jagielski case BIFF_FONTUNDERL_SINGLE: mnUnderline = XML_single; break;
644*b1cdbd2cSJim Jagielski case BIFF_FONTUNDERL_DOUBLE: mnUnderline = XML_double; break;
645*b1cdbd2cSJim Jagielski case BIFF_FONTUNDERL_SINGLE_ACC: mnUnderline = XML_singleAccounting; break;
646*b1cdbd2cSJim Jagielski case BIFF_FONTUNDERL_DOUBLE_ACC: mnUnderline = XML_doubleAccounting; break;
647*b1cdbd2cSJim Jagielski default: mnUnderline = XML_none;
648*b1cdbd2cSJim Jagielski }
649*b1cdbd2cSJim Jagielski }
650*b1cdbd2cSJim Jagielski
setBiffEscapement(sal_uInt16 nEscapement)651*b1cdbd2cSJim Jagielski void FontModel::setBiffEscapement( sal_uInt16 nEscapement )
652*b1cdbd2cSJim Jagielski {
653*b1cdbd2cSJim Jagielski static const sal_Int32 spnEscapes[] = { XML_baseline, XML_superscript, XML_subscript };
654*b1cdbd2cSJim Jagielski mnEscapement = STATIC_ARRAY_SELECT( spnEscapes, nEscapement, XML_baseline );
655*b1cdbd2cSJim Jagielski }
656*b1cdbd2cSJim Jagielski
657*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
658*b1cdbd2cSJim Jagielski
ApiFontUsedFlags(bool bAllUsed)659*b1cdbd2cSJim Jagielski ApiFontUsedFlags::ApiFontUsedFlags( bool bAllUsed ) :
660*b1cdbd2cSJim Jagielski mbNameUsed( bAllUsed ),
661*b1cdbd2cSJim Jagielski mbColorUsed( bAllUsed ),
662*b1cdbd2cSJim Jagielski mbSchemeUsed( bAllUsed ),
663*b1cdbd2cSJim Jagielski mbHeightUsed( bAllUsed ),
664*b1cdbd2cSJim Jagielski mbUnderlineUsed( bAllUsed ),
665*b1cdbd2cSJim Jagielski mbEscapementUsed( bAllUsed ),
666*b1cdbd2cSJim Jagielski mbWeightUsed( bAllUsed ),
667*b1cdbd2cSJim Jagielski mbPostureUsed( bAllUsed ),
668*b1cdbd2cSJim Jagielski mbStrikeoutUsed( bAllUsed ),
669*b1cdbd2cSJim Jagielski mbOutlineUsed( bAllUsed ),
670*b1cdbd2cSJim Jagielski mbShadowUsed( bAllUsed )
671*b1cdbd2cSJim Jagielski {
672*b1cdbd2cSJim Jagielski }
673*b1cdbd2cSJim Jagielski
674*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
675*b1cdbd2cSJim Jagielski
ApiScriptFontName()676*b1cdbd2cSJim Jagielski ApiScriptFontName::ApiScriptFontName() :
677*b1cdbd2cSJim Jagielski mnFamily( ::com::sun::star::awt::FontFamily::DONTKNOW ),
678*b1cdbd2cSJim Jagielski mnTextEnc( RTL_TEXTENCODING_DONTKNOW )
679*b1cdbd2cSJim Jagielski {
680*b1cdbd2cSJim Jagielski }
681*b1cdbd2cSJim Jagielski
682*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
683*b1cdbd2cSJim Jagielski
ApiFontData()684*b1cdbd2cSJim Jagielski ApiFontData::ApiFontData() :
685*b1cdbd2cSJim Jagielski maDesc(
686*b1cdbd2cSJim Jagielski CREATE_OUSTRING( "Calibri" ),
687*b1cdbd2cSJim Jagielski 220, // height 11 points
688*b1cdbd2cSJim Jagielski 0,
689*b1cdbd2cSJim Jagielski OUString(),
690*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontFamily::DONTKNOW,
691*b1cdbd2cSJim Jagielski RTL_TEXTENCODING_DONTKNOW,
692*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontPitch::DONTKNOW,
693*b1cdbd2cSJim Jagielski 100.0,
694*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontWeight::NORMAL,
695*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontSlant_NONE,
696*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontUnderline::NONE,
697*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontStrikeout::NONE,
698*b1cdbd2cSJim Jagielski 0.0,
699*b1cdbd2cSJim Jagielski sal_False,
700*b1cdbd2cSJim Jagielski sal_False,
701*b1cdbd2cSJim Jagielski ::com::sun::star::awt::FontType::DONTKNOW ),
702*b1cdbd2cSJim Jagielski mnColor( API_RGB_TRANSPARENT ),
703*b1cdbd2cSJim Jagielski mnEscapement( API_ESCAPE_NONE ),
704*b1cdbd2cSJim Jagielski mnEscapeHeight( API_ESCAPEHEIGHT_NONE ),
705*b1cdbd2cSJim Jagielski mbOutline( false ),
706*b1cdbd2cSJim Jagielski mbShadow( false )
707*b1cdbd2cSJim Jagielski {
708*b1cdbd2cSJim Jagielski maLatinFont.maName = maDesc.Name;
709*b1cdbd2cSJim Jagielski }
710*b1cdbd2cSJim Jagielski
711*b1cdbd2cSJim Jagielski // ============================================================================
712*b1cdbd2cSJim Jagielski
Font(const WorkbookHelper & rHelper,bool bDxf)713*b1cdbd2cSJim Jagielski Font::Font( const WorkbookHelper& rHelper, bool bDxf ) :
714*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
715*b1cdbd2cSJim Jagielski maModel( rHelper.getTheme().getDefaultFontModel() ),
716*b1cdbd2cSJim Jagielski maUsedFlags( !bDxf ),
717*b1cdbd2cSJim Jagielski mbDxf( bDxf )
718*b1cdbd2cSJim Jagielski {
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski
Font(const WorkbookHelper & rHelper,const FontModel & rModel)721*b1cdbd2cSJim Jagielski Font::Font( const WorkbookHelper& rHelper, const FontModel& rModel ) :
722*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
723*b1cdbd2cSJim Jagielski maModel( rModel ),
724*b1cdbd2cSJim Jagielski maUsedFlags( true ),
725*b1cdbd2cSJim Jagielski mbDxf( false )
726*b1cdbd2cSJim Jagielski {
727*b1cdbd2cSJim Jagielski }
728*b1cdbd2cSJim Jagielski
importAttribs(sal_Int32 nElement,const AttributeList & rAttribs)729*b1cdbd2cSJim Jagielski void Font::importAttribs( sal_Int32 nElement, const AttributeList& rAttribs )
730*b1cdbd2cSJim Jagielski {
731*b1cdbd2cSJim Jagielski const FontModel& rDefModel = getTheme().getDefaultFontModel();
732*b1cdbd2cSJim Jagielski switch( nElement )
733*b1cdbd2cSJim Jagielski {
734*b1cdbd2cSJim Jagielski case XLS_TOKEN( name ): // when in <font> element
735*b1cdbd2cSJim Jagielski case XLS_TOKEN( rFont ): // when in <rPr> element
736*b1cdbd2cSJim Jagielski if( rAttribs.hasAttribute( XML_val ) )
737*b1cdbd2cSJim Jagielski {
738*b1cdbd2cSJim Jagielski maModel.maName = rAttribs.getXString( XML_val, OUString() );
739*b1cdbd2cSJim Jagielski maUsedFlags.mbNameUsed = true;
740*b1cdbd2cSJim Jagielski }
741*b1cdbd2cSJim Jagielski break;
742*b1cdbd2cSJim Jagielski case XLS_TOKEN( scheme ):
743*b1cdbd2cSJim Jagielski maModel.mnScheme = rAttribs.getToken( XML_val, rDefModel.mnScheme );
744*b1cdbd2cSJim Jagielski break;
745*b1cdbd2cSJim Jagielski case XLS_TOKEN( family ):
746*b1cdbd2cSJim Jagielski maModel.mnFamily = rAttribs.getInteger( XML_val, rDefModel.mnFamily );
747*b1cdbd2cSJim Jagielski break;
748*b1cdbd2cSJim Jagielski case XLS_TOKEN( charset ):
749*b1cdbd2cSJim Jagielski maModel.mnCharSet = rAttribs.getInteger( XML_val, rDefModel.mnCharSet );
750*b1cdbd2cSJim Jagielski break;
751*b1cdbd2cSJim Jagielski case XLS_TOKEN( sz ):
752*b1cdbd2cSJim Jagielski maModel.mfHeight = rAttribs.getDouble( XML_val, rDefModel.mfHeight );
753*b1cdbd2cSJim Jagielski maUsedFlags.mbHeightUsed = true;
754*b1cdbd2cSJim Jagielski break;
755*b1cdbd2cSJim Jagielski case XLS_TOKEN( color ):
756*b1cdbd2cSJim Jagielski maModel.maColor.importColor( rAttribs );
757*b1cdbd2cSJim Jagielski maUsedFlags.mbColorUsed = true;
758*b1cdbd2cSJim Jagielski break;
759*b1cdbd2cSJim Jagielski case XLS_TOKEN( u ):
760*b1cdbd2cSJim Jagielski maModel.mnUnderline = rAttribs.getToken( XML_val, XML_single );
761*b1cdbd2cSJim Jagielski maUsedFlags.mbUnderlineUsed = true;
762*b1cdbd2cSJim Jagielski break;
763*b1cdbd2cSJim Jagielski case XLS_TOKEN( vertAlign ):
764*b1cdbd2cSJim Jagielski maModel.mnEscapement = rAttribs.getToken( XML_val, XML_baseline );
765*b1cdbd2cSJim Jagielski maUsedFlags.mbEscapementUsed = true;
766*b1cdbd2cSJim Jagielski break;
767*b1cdbd2cSJim Jagielski case XLS_TOKEN( b ):
768*b1cdbd2cSJim Jagielski maModel.mbBold = rAttribs.getBool( XML_val, true );
769*b1cdbd2cSJim Jagielski maUsedFlags.mbWeightUsed = true;
770*b1cdbd2cSJim Jagielski break;
771*b1cdbd2cSJim Jagielski case XLS_TOKEN( i ):
772*b1cdbd2cSJim Jagielski maModel.mbItalic = rAttribs.getBool( XML_val, true );
773*b1cdbd2cSJim Jagielski maUsedFlags.mbPostureUsed = true;
774*b1cdbd2cSJim Jagielski break;
775*b1cdbd2cSJim Jagielski case XLS_TOKEN( strike ):
776*b1cdbd2cSJim Jagielski maModel.mbStrikeout = rAttribs.getBool( XML_val, true );
777*b1cdbd2cSJim Jagielski maUsedFlags.mbStrikeoutUsed = true;
778*b1cdbd2cSJim Jagielski break;
779*b1cdbd2cSJim Jagielski case XLS_TOKEN( outline ):
780*b1cdbd2cSJim Jagielski maModel.mbOutline = rAttribs.getBool( XML_val, true );
781*b1cdbd2cSJim Jagielski maUsedFlags.mbOutlineUsed = true;
782*b1cdbd2cSJim Jagielski break;
783*b1cdbd2cSJim Jagielski case XLS_TOKEN( shadow ):
784*b1cdbd2cSJim Jagielski maModel.mbShadow = rAttribs.getBool( XML_val, true );
785*b1cdbd2cSJim Jagielski maUsedFlags.mbShadowUsed = true;
786*b1cdbd2cSJim Jagielski break;
787*b1cdbd2cSJim Jagielski }
788*b1cdbd2cSJim Jagielski }
789*b1cdbd2cSJim Jagielski
importFont(SequenceInputStream & rStrm)790*b1cdbd2cSJim Jagielski void Font::importFont( SequenceInputStream& rStrm )
791*b1cdbd2cSJim Jagielski {
792*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Font::importFont - unexpected conditional formatting flag" );
793*b1cdbd2cSJim Jagielski
794*b1cdbd2cSJim Jagielski sal_uInt16 nHeight, nFlags, nWeight, nEscapement;
795*b1cdbd2cSJim Jagielski sal_uInt8 nUnderline, nFamily, nCharSet, nScheme;
796*b1cdbd2cSJim Jagielski rStrm >> nHeight >> nFlags >> nWeight >> nEscapement >> nUnderline >> nFamily >> nCharSet;
797*b1cdbd2cSJim Jagielski rStrm.skip( 1 );
798*b1cdbd2cSJim Jagielski rStrm >> maModel.maColor >> nScheme >> maModel.maName;
799*b1cdbd2cSJim Jagielski
800*b1cdbd2cSJim Jagielski // equal constants in all BIFFs for weight, underline, and escapement
801*b1cdbd2cSJim Jagielski maModel.setBiff12Scheme( nScheme );
802*b1cdbd2cSJim Jagielski maModel.setBiffHeight( nHeight );
803*b1cdbd2cSJim Jagielski maModel.setBiffWeight( nWeight );
804*b1cdbd2cSJim Jagielski maModel.setBiffUnderline( nUnderline );
805*b1cdbd2cSJim Jagielski maModel.setBiffEscapement( nEscapement );
806*b1cdbd2cSJim Jagielski maModel.mnFamily = nFamily;
807*b1cdbd2cSJim Jagielski maModel.mnCharSet = nCharSet;
808*b1cdbd2cSJim Jagielski // equal flags in all BIFFs
809*b1cdbd2cSJim Jagielski maModel.mbItalic = getFlag( nFlags, BIFF_FONTFLAG_ITALIC );
810*b1cdbd2cSJim Jagielski maModel.mbStrikeout = getFlag( nFlags, BIFF_FONTFLAG_STRIKEOUT );
811*b1cdbd2cSJim Jagielski maModel.mbOutline = getFlag( nFlags, BIFF_FONTFLAG_OUTLINE );
812*b1cdbd2cSJim Jagielski maModel.mbShadow = getFlag( nFlags, BIFF_FONTFLAG_SHADOW );
813*b1cdbd2cSJim Jagielski }
814*b1cdbd2cSJim Jagielski
importDxfName(SequenceInputStream & rStrm)815*b1cdbd2cSJim Jagielski void Font::importDxfName( SequenceInputStream& rStrm )
816*b1cdbd2cSJim Jagielski {
817*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfName - missing conditional formatting flag" );
818*b1cdbd2cSJim Jagielski maModel.maName = BiffHelper::readString( rStrm, false );
819*b1cdbd2cSJim Jagielski maUsedFlags.mbColorUsed = true;
820*b1cdbd2cSJim Jagielski }
821*b1cdbd2cSJim Jagielski
importDxfColor(SequenceInputStream & rStrm)822*b1cdbd2cSJim Jagielski void Font::importDxfColor( SequenceInputStream& rStrm )
823*b1cdbd2cSJim Jagielski {
824*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfColor - missing conditional formatting flag" );
825*b1cdbd2cSJim Jagielski rStrm >> maModel.maColor;
826*b1cdbd2cSJim Jagielski maUsedFlags.mbColorUsed = true;
827*b1cdbd2cSJim Jagielski }
828*b1cdbd2cSJim Jagielski
importDxfScheme(SequenceInputStream & rStrm)829*b1cdbd2cSJim Jagielski void Font::importDxfScheme( SequenceInputStream& rStrm )
830*b1cdbd2cSJim Jagielski {
831*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfScheme - missing conditional formatting flag" );
832*b1cdbd2cSJim Jagielski maModel.setBiff12Scheme( rStrm.readuInt8() );
833*b1cdbd2cSJim Jagielski maUsedFlags.mbSchemeUsed = true;
834*b1cdbd2cSJim Jagielski }
835*b1cdbd2cSJim Jagielski
importDxfHeight(SequenceInputStream & rStrm)836*b1cdbd2cSJim Jagielski void Font::importDxfHeight( SequenceInputStream& rStrm )
837*b1cdbd2cSJim Jagielski {
838*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfHeight - missing conditional formatting flag" );
839*b1cdbd2cSJim Jagielski maModel.setBiffHeight( rStrm.readuInt16() );
840*b1cdbd2cSJim Jagielski maUsedFlags.mbHeightUsed = true;
841*b1cdbd2cSJim Jagielski }
842*b1cdbd2cSJim Jagielski
importDxfWeight(SequenceInputStream & rStrm)843*b1cdbd2cSJim Jagielski void Font::importDxfWeight( SequenceInputStream& rStrm )
844*b1cdbd2cSJim Jagielski {
845*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfWeight - missing conditional formatting flag" );
846*b1cdbd2cSJim Jagielski maModel.setBiffWeight( rStrm.readuInt16() );
847*b1cdbd2cSJim Jagielski maUsedFlags.mbWeightUsed = true;
848*b1cdbd2cSJim Jagielski }
849*b1cdbd2cSJim Jagielski
importDxfUnderline(SequenceInputStream & rStrm)850*b1cdbd2cSJim Jagielski void Font::importDxfUnderline( SequenceInputStream& rStrm )
851*b1cdbd2cSJim Jagielski {
852*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfUnderline - missing conditional formatting flag" );
853*b1cdbd2cSJim Jagielski maModel.setBiffUnderline( rStrm.readuInt16() );
854*b1cdbd2cSJim Jagielski maUsedFlags.mbUnderlineUsed = true;
855*b1cdbd2cSJim Jagielski }
856*b1cdbd2cSJim Jagielski
importDxfEscapement(SequenceInputStream & rStrm)857*b1cdbd2cSJim Jagielski void Font::importDxfEscapement( SequenceInputStream& rStrm )
858*b1cdbd2cSJim Jagielski {
859*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfEscapement - missing conditional formatting flag" );
860*b1cdbd2cSJim Jagielski maModel.setBiffEscapement( rStrm.readuInt16() );
861*b1cdbd2cSJim Jagielski maUsedFlags.mbEscapementUsed = true;
862*b1cdbd2cSJim Jagielski }
863*b1cdbd2cSJim Jagielski
importDxfFlag(sal_Int32 nElement,SequenceInputStream & rStrm)864*b1cdbd2cSJim Jagielski void Font::importDxfFlag( sal_Int32 nElement, SequenceInputStream& rStrm )
865*b1cdbd2cSJim Jagielski {
866*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importDxfFlag - missing conditional formatting flag" );
867*b1cdbd2cSJim Jagielski bool bFlag = rStrm.readuInt8() != 0;
868*b1cdbd2cSJim Jagielski switch( nElement )
869*b1cdbd2cSJim Jagielski {
870*b1cdbd2cSJim Jagielski case XML_i:
871*b1cdbd2cSJim Jagielski maModel.mbItalic = bFlag;
872*b1cdbd2cSJim Jagielski maUsedFlags.mbPostureUsed = true;
873*b1cdbd2cSJim Jagielski break;
874*b1cdbd2cSJim Jagielski case XML_strike:
875*b1cdbd2cSJim Jagielski maModel.mbStrikeout = bFlag;
876*b1cdbd2cSJim Jagielski maUsedFlags.mbStrikeoutUsed = true;
877*b1cdbd2cSJim Jagielski break;
878*b1cdbd2cSJim Jagielski case XML_outline:
879*b1cdbd2cSJim Jagielski maModel.mbOutline = bFlag;
880*b1cdbd2cSJim Jagielski maUsedFlags.mbOutlineUsed = true;
881*b1cdbd2cSJim Jagielski break;
882*b1cdbd2cSJim Jagielski case XML_shadow:
883*b1cdbd2cSJim Jagielski maModel.mbShadow = bFlag;
884*b1cdbd2cSJim Jagielski maUsedFlags.mbShadowUsed = true;
885*b1cdbd2cSJim Jagielski break;
886*b1cdbd2cSJim Jagielski default:
887*b1cdbd2cSJim Jagielski OSL_ENSURE( false, "Font::importDxfFlag - unexpected element identifier" );
888*b1cdbd2cSJim Jagielski }
889*b1cdbd2cSJim Jagielski }
890*b1cdbd2cSJim Jagielski
importFont(BiffInputStream & rStrm)891*b1cdbd2cSJim Jagielski void Font::importFont( BiffInputStream& rStrm )
892*b1cdbd2cSJim Jagielski {
893*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Font::importFont - unexpected conditional formatting flag" );
894*b1cdbd2cSJim Jagielski switch( getBiff() )
895*b1cdbd2cSJim Jagielski {
896*b1cdbd2cSJim Jagielski case BIFF2:
897*b1cdbd2cSJim Jagielski importFontData2( rStrm );
898*b1cdbd2cSJim Jagielski importFontName2( rStrm );
899*b1cdbd2cSJim Jagielski break;
900*b1cdbd2cSJim Jagielski case BIFF3:
901*b1cdbd2cSJim Jagielski case BIFF4:
902*b1cdbd2cSJim Jagielski importFontData2( rStrm );
903*b1cdbd2cSJim Jagielski importFontColor( rStrm );
904*b1cdbd2cSJim Jagielski importFontName2( rStrm );
905*b1cdbd2cSJim Jagielski break;
906*b1cdbd2cSJim Jagielski case BIFF5:
907*b1cdbd2cSJim Jagielski importFontData2( rStrm );
908*b1cdbd2cSJim Jagielski importFontColor( rStrm );
909*b1cdbd2cSJim Jagielski importFontData5( rStrm );
910*b1cdbd2cSJim Jagielski importFontName2( rStrm );
911*b1cdbd2cSJim Jagielski break;
912*b1cdbd2cSJim Jagielski case BIFF8:
913*b1cdbd2cSJim Jagielski importFontData2( rStrm );
914*b1cdbd2cSJim Jagielski importFontColor( rStrm );
915*b1cdbd2cSJim Jagielski importFontData5( rStrm );
916*b1cdbd2cSJim Jagielski importFontName8( rStrm );
917*b1cdbd2cSJim Jagielski break;
918*b1cdbd2cSJim Jagielski case BIFF_UNKNOWN: break;
919*b1cdbd2cSJim Jagielski }
920*b1cdbd2cSJim Jagielski }
921*b1cdbd2cSJim Jagielski
importFontColor(BiffInputStream & rStrm)922*b1cdbd2cSJim Jagielski void Font::importFontColor( BiffInputStream& rStrm )
923*b1cdbd2cSJim Jagielski {
924*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Font::importFontColor - unexpected conditional formatting flag" );
925*b1cdbd2cSJim Jagielski maModel.maColor.importColorId( rStrm );
926*b1cdbd2cSJim Jagielski }
927*b1cdbd2cSJim Jagielski
importCfRule(BiffInputStream & rStrm)928*b1cdbd2cSJim Jagielski void Font::importCfRule( BiffInputStream& rStrm )
929*b1cdbd2cSJim Jagielski {
930*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Font::importCfRule - missing conditional formatting flag" );
931*b1cdbd2cSJim Jagielski
932*b1cdbd2cSJim Jagielski sal_Int32 nHeight, nColor;
933*b1cdbd2cSJim Jagielski sal_uInt32 nStyle, nFontFlags1, nFontFlags2, nFontFlags3;
934*b1cdbd2cSJim Jagielski sal_uInt16 nWeight, nEscapement;
935*b1cdbd2cSJim Jagielski sal_uInt8 nUnderline;
936*b1cdbd2cSJim Jagielski
937*b1cdbd2cSJim Jagielski OSL_ENSURE( rStrm.getRemaining() >= 118, "Font::importCfRule - missing record data" );
938*b1cdbd2cSJim Jagielski sal_Int64 nRecPos = rStrm.tell();
939*b1cdbd2cSJim Jagielski maModel.maName = rStrm.readUniStringBody( rStrm.readuInt8() );
940*b1cdbd2cSJim Jagielski maUsedFlags.mbNameUsed = maModel.maName.getLength() > 0;
941*b1cdbd2cSJim Jagielski OSL_ENSURE( !rStrm.isEof() && (rStrm.tell() <= nRecPos + 64), "Font::importCfRule - font name too long" );
942*b1cdbd2cSJim Jagielski rStrm.seek( nRecPos + 64 );
943*b1cdbd2cSJim Jagielski rStrm >> nHeight >> nStyle >> nWeight >> nEscapement >> nUnderline;
944*b1cdbd2cSJim Jagielski rStrm.skip( 3 );
945*b1cdbd2cSJim Jagielski rStrm >> nColor;
946*b1cdbd2cSJim Jagielski rStrm.skip( 4 );
947*b1cdbd2cSJim Jagielski rStrm >> nFontFlags1 >> nFontFlags2 >> nFontFlags3;
948*b1cdbd2cSJim Jagielski rStrm.skip( 18 );
949*b1cdbd2cSJim Jagielski
950*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbColorUsed = (0 <= nColor) && (nColor <= 0x7FFF)) == true )
951*b1cdbd2cSJim Jagielski maModel.maColor.setIndexed( nColor );
952*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbHeightUsed = (0 < nHeight) && (nHeight <= 0x7FFF)) == true )
953*b1cdbd2cSJim Jagielski maModel.setBiffHeight( static_cast< sal_uInt16 >( nHeight ) );
954*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbUnderlineUsed = !getFlag( nFontFlags3, BIFF_CFRULE_FONT_UNDERL )) == true )
955*b1cdbd2cSJim Jagielski maModel.setBiffUnderline( nUnderline );
956*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbEscapementUsed = !getFlag( nFontFlags2, BIFF_CFRULE_FONT_ESCAPEM )) == true )
957*b1cdbd2cSJim Jagielski maModel.setBiffEscapement( nEscapement );
958*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbWeightUsed = maUsedFlags.mbPostureUsed = !getFlag( nFontFlags1, BIFF_CFRULE_FONT_STYLE )) == true )
959*b1cdbd2cSJim Jagielski {
960*b1cdbd2cSJim Jagielski maModel.setBiffWeight( nWeight );
961*b1cdbd2cSJim Jagielski maModel.mbItalic = getFlag( nStyle, BIFF_CFRULE_FONT_STYLE );
962*b1cdbd2cSJim Jagielski }
963*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbStrikeoutUsed = !getFlag( nFontFlags1, BIFF_CFRULE_FONT_STRIKEOUT )) == true )
964*b1cdbd2cSJim Jagielski maModel.mbStrikeout = getFlag( nStyle, BIFF_CFRULE_FONT_STRIKEOUT );
965*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbOutlineUsed = !getFlag( nFontFlags1, BIFF_CFRULE_FONT_OUTLINE )) == true )
966*b1cdbd2cSJim Jagielski maModel.mbOutline = getFlag( nStyle, BIFF_CFRULE_FONT_OUTLINE );
967*b1cdbd2cSJim Jagielski if( (maUsedFlags.mbShadowUsed = !getFlag( nFontFlags1, BIFF_CFRULE_FONT_SHADOW )) == true )
968*b1cdbd2cSJim Jagielski maModel.mbShadow = getFlag( nStyle, BIFF_CFRULE_FONT_SHADOW );
969*b1cdbd2cSJim Jagielski }
970*b1cdbd2cSJim Jagielski
getFontEncoding() const971*b1cdbd2cSJim Jagielski rtl_TextEncoding Font::getFontEncoding() const
972*b1cdbd2cSJim Jagielski {
973*b1cdbd2cSJim Jagielski // #i63105# cells use text encoding from FONT record character set
974*b1cdbd2cSJim Jagielski // #i67768# BIFF2-BIFF4 FONT records do not contain character set
975*b1cdbd2cSJim Jagielski // #i71033# do not use maApiData, this function is used before finalizeImport()
976*b1cdbd2cSJim Jagielski rtl_TextEncoding eFontEnc = RTL_TEXTENCODING_DONTKNOW;
977*b1cdbd2cSJim Jagielski if( (0 <= maModel.mnCharSet) && (maModel.mnCharSet <= SAL_MAX_UINT8) )
978*b1cdbd2cSJim Jagielski eFontEnc = rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maModel.mnCharSet ) );
979*b1cdbd2cSJim Jagielski return (eFontEnc == RTL_TEXTENCODING_DONTKNOW) ? getTextEncoding() : eFontEnc;
980*b1cdbd2cSJim Jagielski }
981*b1cdbd2cSJim Jagielski
finalizeImport()982*b1cdbd2cSJim Jagielski void Font::finalizeImport()
983*b1cdbd2cSJim Jagielski {
984*b1cdbd2cSJim Jagielski namespace cssawt = ::com::sun::star::awt;
985*b1cdbd2cSJim Jagielski
986*b1cdbd2cSJim Jagielski // font name
987*b1cdbd2cSJim Jagielski maApiData.maDesc.Name = maModel.maName;
988*b1cdbd2cSJim Jagielski
989*b1cdbd2cSJim Jagielski // font family
990*b1cdbd2cSJim Jagielski switch( maModel.mnFamily )
991*b1cdbd2cSJim Jagielski {
992*b1cdbd2cSJim Jagielski case OOX_FONTFAMILY_NONE: maApiData.maDesc.Family = cssawt::FontFamily::DONTKNOW; break;
993*b1cdbd2cSJim Jagielski case OOX_FONTFAMILY_ROMAN: maApiData.maDesc.Family = cssawt::FontFamily::ROMAN; break;
994*b1cdbd2cSJim Jagielski case OOX_FONTFAMILY_SWISS: maApiData.maDesc.Family = cssawt::FontFamily::SWISS; break;
995*b1cdbd2cSJim Jagielski case OOX_FONTFAMILY_MODERN: maApiData.maDesc.Family = cssawt::FontFamily::MODERN; break;
996*b1cdbd2cSJim Jagielski case OOX_FONTFAMILY_SCRIPT: maApiData.maDesc.Family = cssawt::FontFamily::SCRIPT; break;
997*b1cdbd2cSJim Jagielski case OOX_FONTFAMILY_DECORATIVE: maApiData.maDesc.Family = cssawt::FontFamily::DECORATIVE; break;
998*b1cdbd2cSJim Jagielski }
999*b1cdbd2cSJim Jagielski
1000*b1cdbd2cSJim Jagielski // character set (API font descriptor uses rtl_TextEncoding in member CharSet!)
1001*b1cdbd2cSJim Jagielski if( (0 <= maModel.mnCharSet) && (maModel.mnCharSet <= SAL_MAX_UINT8) )
1002*b1cdbd2cSJim Jagielski maApiData.maDesc.CharSet = static_cast< sal_Int16 >(
1003*b1cdbd2cSJim Jagielski rtl_getTextEncodingFromWindowsCharset( static_cast< sal_uInt8 >( maModel.mnCharSet ) ) );
1004*b1cdbd2cSJim Jagielski
1005*b1cdbd2cSJim Jagielski // color, height, weight, slant, strikeout, outline, shadow
1006*b1cdbd2cSJim Jagielski maApiData.mnColor = maModel.maColor.getColor( getBaseFilter().getGraphicHelper() );
1007*b1cdbd2cSJim Jagielski maApiData.maDesc.Height = static_cast< sal_Int16 >( maModel.mfHeight * 20.0 );
1008*b1cdbd2cSJim Jagielski maApiData.maDesc.Weight = maModel.mbBold ? cssawt::FontWeight::BOLD : cssawt::FontWeight::NORMAL;
1009*b1cdbd2cSJim Jagielski maApiData.maDesc.Slant = maModel.mbItalic ? cssawt::FontSlant_ITALIC : cssawt::FontSlant_NONE;
1010*b1cdbd2cSJim Jagielski maApiData.maDesc.Strikeout = maModel.mbStrikeout ? cssawt::FontStrikeout::SINGLE : cssawt::FontStrikeout::NONE;
1011*b1cdbd2cSJim Jagielski maApiData.mbOutline = maModel.mbOutline;
1012*b1cdbd2cSJim Jagielski maApiData.mbShadow = maModel.mbShadow;
1013*b1cdbd2cSJim Jagielski
1014*b1cdbd2cSJim Jagielski // underline
1015*b1cdbd2cSJim Jagielski switch( maModel.mnUnderline )
1016*b1cdbd2cSJim Jagielski {
1017*b1cdbd2cSJim Jagielski case XML_double: maApiData.maDesc.Underline = cssawt::FontUnderline::DOUBLE; break;
1018*b1cdbd2cSJim Jagielski case XML_doubleAccounting: maApiData.maDesc.Underline = cssawt::FontUnderline::DOUBLE; break;
1019*b1cdbd2cSJim Jagielski case XML_none: maApiData.maDesc.Underline = cssawt::FontUnderline::NONE; break;
1020*b1cdbd2cSJim Jagielski case XML_single: maApiData.maDesc.Underline = cssawt::FontUnderline::SINGLE; break;
1021*b1cdbd2cSJim Jagielski case XML_singleAccounting: maApiData.maDesc.Underline = cssawt::FontUnderline::SINGLE; break;
1022*b1cdbd2cSJim Jagielski }
1023*b1cdbd2cSJim Jagielski
1024*b1cdbd2cSJim Jagielski // escapement
1025*b1cdbd2cSJim Jagielski switch( maModel.mnEscapement )
1026*b1cdbd2cSJim Jagielski {
1027*b1cdbd2cSJim Jagielski case XML_baseline:
1028*b1cdbd2cSJim Jagielski maApiData.mnEscapement = API_ESCAPE_NONE;
1029*b1cdbd2cSJim Jagielski maApiData.mnEscapeHeight = API_ESCAPEHEIGHT_NONE;
1030*b1cdbd2cSJim Jagielski break;
1031*b1cdbd2cSJim Jagielski case XML_superscript:
1032*b1cdbd2cSJim Jagielski maApiData.mnEscapement = API_ESCAPE_SUPERSCRIPT;
1033*b1cdbd2cSJim Jagielski maApiData.mnEscapeHeight = API_ESCAPEHEIGHT_DEFAULT;
1034*b1cdbd2cSJim Jagielski break;
1035*b1cdbd2cSJim Jagielski case XML_subscript:
1036*b1cdbd2cSJim Jagielski maApiData.mnEscapement = API_ESCAPE_SUBSCRIPT;
1037*b1cdbd2cSJim Jagielski maApiData.mnEscapeHeight = API_ESCAPEHEIGHT_DEFAULT;
1038*b1cdbd2cSJim Jagielski break;
1039*b1cdbd2cSJim Jagielski }
1040*b1cdbd2cSJim Jagielski
1041*b1cdbd2cSJim Jagielski // supported script types
1042*b1cdbd2cSJim Jagielski if( maUsedFlags.mbNameUsed )
1043*b1cdbd2cSJim Jagielski {
1044*b1cdbd2cSJim Jagielski PropertySet aDocProps( getDocument() );
1045*b1cdbd2cSJim Jagielski Reference< XDevice > xDevice( aDocProps.getAnyProperty( PROP_ReferenceDevice ), UNO_QUERY );
1046*b1cdbd2cSJim Jagielski if( xDevice.is() )
1047*b1cdbd2cSJim Jagielski {
1048*b1cdbd2cSJim Jagielski Reference< XFont2 > xFont( xDevice->getFont( maApiData.maDesc ), UNO_QUERY );
1049*b1cdbd2cSJim Jagielski if( xFont.is() )
1050*b1cdbd2cSJim Jagielski {
1051*b1cdbd2cSJim Jagielski // #91658# CJK fonts
1052*b1cdbd2cSJim Jagielski bool bHasAsian =
1053*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x3041 ) ) ) || // 3040-309F: Hiragana
1054*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x30A1 ) ) ) || // 30A0-30FF: Katakana
1055*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x3111 ) ) ) || // 3100-312F: Bopomofo
1056*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x3131 ) ) ) || // 3130-318F: Hangul Compatibility Jamo
1057*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x3301 ) ) ) || // 3300-33FF: CJK Compatibility
1058*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x3401 ) ) ) || // 3400-4DBF: CJK Unified Ideographs Extension A
1059*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x4E01 ) ) ) || // 4E00-9FAF: CJK Unified Ideographs
1060*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x7E01 ) ) ) || // 4E00-9FAF: CJK unified ideographs
1061*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xA001 ) ) ) || // A001-A48F: Yi Syllables
1062*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xAC01 ) ) ) || // AC00-D7AF: Hangul Syllables
1063*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xCC01 ) ) ) || // AC00-D7AF: Hangul Syllables
1064*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xF901 ) ) ) || // F900-FAFF: CJK Compatibility Ideographs
1065*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xFF71 ) ) ); // FF00-FFEF: Halfwidth/Fullwidth Forms
1066*b1cdbd2cSJim Jagielski // #113783# CTL fonts
1067*b1cdbd2cSJim Jagielski bool bHasCmplx =
1068*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x05D1 ) ) ) || // 0590-05FF: Hebrew
1069*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x0631 ) ) ) || // 0600-06FF: Arabic
1070*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x0721 ) ) ) || // 0700-074F: Syriac
1071*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x0911 ) ) ) || // 0900-0DFF: Indic scripts
1072*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0x0E01 ) ) ) || // 0E00-0E7F: Thai
1073*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xFB21 ) ) ) || // FB1D-FB4F: Hebrew Presentation Forms
1074*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xFB51 ) ) ) || // FB50-FDFF: Arabic Presentation Forms-A
1075*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 0xFE71 ) ) ); // FE70-FEFF: Arabic Presentation Forms-B
1076*b1cdbd2cSJim Jagielski // Western fonts
1077*b1cdbd2cSJim Jagielski bool bHasLatin =
1078*b1cdbd2cSJim Jagielski (!bHasAsian && !bHasCmplx) ||
1079*b1cdbd2cSJim Jagielski xFont->hasGlyphs( OUString( sal_Unicode( 'A' ) ) );
1080*b1cdbd2cSJim Jagielski
1081*b1cdbd2cSJim Jagielski lclSetFontName( maApiData.maLatinFont, maApiData.maDesc, bHasLatin );
1082*b1cdbd2cSJim Jagielski lclSetFontName( maApiData.maAsianFont, maApiData.maDesc, bHasAsian );
1083*b1cdbd2cSJim Jagielski lclSetFontName( maApiData.maCmplxFont, maApiData.maDesc, bHasCmplx );
1084*b1cdbd2cSJim Jagielski }
1085*b1cdbd2cSJim Jagielski }
1086*b1cdbd2cSJim Jagielski }
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski
getFontDescriptor() const1089*b1cdbd2cSJim Jagielski const FontDescriptor& Font::getFontDescriptor() const
1090*b1cdbd2cSJim Jagielski {
1091*b1cdbd2cSJim Jagielski return maApiData.maDesc;
1092*b1cdbd2cSJim Jagielski }
1093*b1cdbd2cSJim Jagielski
needsRichTextFormat() const1094*b1cdbd2cSJim Jagielski bool Font::needsRichTextFormat() const
1095*b1cdbd2cSJim Jagielski {
1096*b1cdbd2cSJim Jagielski return maApiData.mnEscapement != API_ESCAPE_NONE;
1097*b1cdbd2cSJim Jagielski }
1098*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap,FontPropertyType ePropType) const1099*b1cdbd2cSJim Jagielski void Font::writeToPropertyMap( PropertyMap& rPropMap, FontPropertyType ePropType ) const
1100*b1cdbd2cSJim Jagielski {
1101*b1cdbd2cSJim Jagielski // font name properties
1102*b1cdbd2cSJim Jagielski if( maUsedFlags.mbNameUsed )
1103*b1cdbd2cSJim Jagielski {
1104*b1cdbd2cSJim Jagielski if( maApiData.maLatinFont.maName.getLength() > 0 )
1105*b1cdbd2cSJim Jagielski {
1106*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontName ] <<= maApiData.maLatinFont.maName;
1107*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontFamily ] <<= maApiData.maLatinFont.mnFamily;
1108*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontCharSet ] <<= maApiData.maLatinFont.mnTextEnc;
1109*b1cdbd2cSJim Jagielski }
1110*b1cdbd2cSJim Jagielski if( maApiData.maAsianFont.maName.getLength() > 0 )
1111*b1cdbd2cSJim Jagielski {
1112*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontNameAsian ] <<= maApiData.maAsianFont.maName;
1113*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontFamilyAsian ] <<= maApiData.maAsianFont.mnFamily;
1114*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontCharSetAsian ] <<= maApiData.maAsianFont.mnTextEnc;
1115*b1cdbd2cSJim Jagielski }
1116*b1cdbd2cSJim Jagielski if( maApiData.maCmplxFont.maName.getLength() > 0 )
1117*b1cdbd2cSJim Jagielski {
1118*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontNameComplex ] <<= maApiData.maCmplxFont.maName;
1119*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontFamilyComplex ] <<= maApiData.maCmplxFont.mnFamily;
1120*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharFontCharSetComplex ] <<= maApiData.maCmplxFont.mnTextEnc;
1121*b1cdbd2cSJim Jagielski }
1122*b1cdbd2cSJim Jagielski }
1123*b1cdbd2cSJim Jagielski // font height
1124*b1cdbd2cSJim Jagielski if( maUsedFlags.mbHeightUsed )
1125*b1cdbd2cSJim Jagielski {
1126*b1cdbd2cSJim Jagielski float fHeight = static_cast< float >( maApiData.maDesc.Height / 20.0 ); // twips to points
1127*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharHeight ] <<= fHeight;
1128*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharHeightAsian ] <<= fHeight;
1129*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharHeightComplex ] <<= fHeight;
1130*b1cdbd2cSJim Jagielski }
1131*b1cdbd2cSJim Jagielski // font weight
1132*b1cdbd2cSJim Jagielski if( maUsedFlags.mbWeightUsed )
1133*b1cdbd2cSJim Jagielski {
1134*b1cdbd2cSJim Jagielski float fWeight = maApiData.maDesc.Weight;
1135*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharWeight ] <<= fWeight;
1136*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharWeightAsian ] <<= fWeight;
1137*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharWeightComplex ] <<= fWeight;
1138*b1cdbd2cSJim Jagielski }
1139*b1cdbd2cSJim Jagielski // font posture
1140*b1cdbd2cSJim Jagielski if( maUsedFlags.mbPostureUsed )
1141*b1cdbd2cSJim Jagielski {
1142*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharPosture ] <<= maApiData.maDesc.Slant;
1143*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharPostureAsian ] <<= maApiData.maDesc.Slant;
1144*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharPostureComplex ] <<= maApiData.maDesc.Slant;
1145*b1cdbd2cSJim Jagielski }
1146*b1cdbd2cSJim Jagielski // character color
1147*b1cdbd2cSJim Jagielski if( maUsedFlags.mbColorUsed )
1148*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharColor ] <<= maApiData.mnColor;
1149*b1cdbd2cSJim Jagielski // underline style
1150*b1cdbd2cSJim Jagielski if( maUsedFlags.mbUnderlineUsed )
1151*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharUnderline ] <<= maApiData.maDesc.Underline;
1152*b1cdbd2cSJim Jagielski // strike out style
1153*b1cdbd2cSJim Jagielski if( maUsedFlags.mbStrikeoutUsed )
1154*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharStrikeout ] <<= maApiData.maDesc.Strikeout;
1155*b1cdbd2cSJim Jagielski // outline style
1156*b1cdbd2cSJim Jagielski if( maUsedFlags.mbOutlineUsed )
1157*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharContoured ] <<= maApiData.mbOutline;
1158*b1cdbd2cSJim Jagielski // shadow style
1159*b1cdbd2cSJim Jagielski if( maUsedFlags.mbShadowUsed )
1160*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharShadowed ] <<= maApiData.mbShadow;
1161*b1cdbd2cSJim Jagielski // escapement
1162*b1cdbd2cSJim Jagielski if( maUsedFlags.mbEscapementUsed && (ePropType == FONT_PROPTYPE_TEXT) )
1163*b1cdbd2cSJim Jagielski {
1164*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharEscapement ] <<= maApiData.mnEscapement;
1165*b1cdbd2cSJim Jagielski rPropMap[ PROP_CharEscapementHeight ] <<= maApiData.mnEscapeHeight;
1166*b1cdbd2cSJim Jagielski }
1167*b1cdbd2cSJim Jagielski }
1168*b1cdbd2cSJim Jagielski
writeToPropertySet(PropertySet & rPropSet,FontPropertyType ePropType) const1169*b1cdbd2cSJim Jagielski void Font::writeToPropertySet( PropertySet& rPropSet, FontPropertyType ePropType ) const
1170*b1cdbd2cSJim Jagielski {
1171*b1cdbd2cSJim Jagielski PropertyMap aPropMap;
1172*b1cdbd2cSJim Jagielski writeToPropertyMap( aPropMap, ePropType );
1173*b1cdbd2cSJim Jagielski rPropSet.setProperties( aPropMap );
1174*b1cdbd2cSJim Jagielski }
1175*b1cdbd2cSJim Jagielski
importFontData2(BiffInputStream & rStrm)1176*b1cdbd2cSJim Jagielski void Font::importFontData2( BiffInputStream& rStrm )
1177*b1cdbd2cSJim Jagielski {
1178*b1cdbd2cSJim Jagielski sal_uInt16 nHeight, nFlags;
1179*b1cdbd2cSJim Jagielski rStrm >> nHeight >> nFlags;
1180*b1cdbd2cSJim Jagielski
1181*b1cdbd2cSJim Jagielski maModel.setBiffHeight( nHeight );
1182*b1cdbd2cSJim Jagielski maModel.mnFamily = OOX_FONTFAMILY_NONE;
1183*b1cdbd2cSJim Jagielski maModel.mnCharSet = -1; // ensure to not use font charset in byte string import
1184*b1cdbd2cSJim Jagielski maModel.mnUnderline = getFlagValue( nFlags, BIFF_FONTFLAG_UNDERLINE, XML_single, XML_none );
1185*b1cdbd2cSJim Jagielski maModel.mnEscapement = XML_none;
1186*b1cdbd2cSJim Jagielski maModel.mbBold = getFlag( nFlags, BIFF_FONTFLAG_BOLD );
1187*b1cdbd2cSJim Jagielski maModel.mbItalic = getFlag( nFlags, BIFF_FONTFLAG_ITALIC );
1188*b1cdbd2cSJim Jagielski maModel.mbStrikeout = getFlag( nFlags, BIFF_FONTFLAG_STRIKEOUT );
1189*b1cdbd2cSJim Jagielski maModel.mbOutline = getFlag( nFlags, BIFF_FONTFLAG_OUTLINE );
1190*b1cdbd2cSJim Jagielski maModel.mbShadow = getFlag( nFlags, BIFF_FONTFLAG_SHADOW );
1191*b1cdbd2cSJim Jagielski }
1192*b1cdbd2cSJim Jagielski
importFontData5(BiffInputStream & rStrm)1193*b1cdbd2cSJim Jagielski void Font::importFontData5( BiffInputStream& rStrm )
1194*b1cdbd2cSJim Jagielski {
1195*b1cdbd2cSJim Jagielski sal_uInt16 nWeight, nEscapement;
1196*b1cdbd2cSJim Jagielski sal_uInt8 nUnderline, nFamily, nCharSet;
1197*b1cdbd2cSJim Jagielski rStrm >> nWeight >> nEscapement >> nUnderline >> nFamily >> nCharSet;
1198*b1cdbd2cSJim Jagielski rStrm.skip( 1 );
1199*b1cdbd2cSJim Jagielski
1200*b1cdbd2cSJim Jagielski maModel.setBiffWeight( nWeight );
1201*b1cdbd2cSJim Jagielski maModel.setBiffUnderline( nUnderline );
1202*b1cdbd2cSJim Jagielski maModel.setBiffEscapement( nEscapement );
1203*b1cdbd2cSJim Jagielski // equal constants in XML and BIFF for family and charset
1204*b1cdbd2cSJim Jagielski maModel.mnFamily = nFamily;
1205*b1cdbd2cSJim Jagielski maModel.mnCharSet = nCharSet;
1206*b1cdbd2cSJim Jagielski }
1207*b1cdbd2cSJim Jagielski
importFontName2(BiffInputStream & rStrm)1208*b1cdbd2cSJim Jagielski void Font::importFontName2( BiffInputStream& rStrm )
1209*b1cdbd2cSJim Jagielski {
1210*b1cdbd2cSJim Jagielski maModel.maName = rStrm.readByteStringUC( false, getTextEncoding() );
1211*b1cdbd2cSJim Jagielski }
1212*b1cdbd2cSJim Jagielski
importFontName8(BiffInputStream & rStrm)1213*b1cdbd2cSJim Jagielski void Font::importFontName8( BiffInputStream& rStrm )
1214*b1cdbd2cSJim Jagielski {
1215*b1cdbd2cSJim Jagielski maModel.maName = rStrm.readUniStringBody( rStrm.readuInt8() );
1216*b1cdbd2cSJim Jagielski }
1217*b1cdbd2cSJim Jagielski
1218*b1cdbd2cSJim Jagielski // ============================================================================
1219*b1cdbd2cSJim Jagielski
AlignmentModel()1220*b1cdbd2cSJim Jagielski AlignmentModel::AlignmentModel() :
1221*b1cdbd2cSJim Jagielski mnHorAlign( XML_general ),
1222*b1cdbd2cSJim Jagielski mnVerAlign( XML_bottom ),
1223*b1cdbd2cSJim Jagielski mnTextDir( OOX_XF_TEXTDIR_CONTEXT ),
1224*b1cdbd2cSJim Jagielski mnRotation( OOX_XF_ROTATION_NONE ),
1225*b1cdbd2cSJim Jagielski mnIndent( OOX_XF_INDENT_NONE ),
1226*b1cdbd2cSJim Jagielski mbWrapText( false ),
1227*b1cdbd2cSJim Jagielski mbShrink( false ),
1228*b1cdbd2cSJim Jagielski mbJustLastLine( false )
1229*b1cdbd2cSJim Jagielski {
1230*b1cdbd2cSJim Jagielski }
1231*b1cdbd2cSJim Jagielski
setBiffHorAlign(sal_uInt8 nHorAlign)1232*b1cdbd2cSJim Jagielski void AlignmentModel::setBiffHorAlign( sal_uInt8 nHorAlign )
1233*b1cdbd2cSJim Jagielski {
1234*b1cdbd2cSJim Jagielski static const sal_Int32 spnHorAligns[] = {
1235*b1cdbd2cSJim Jagielski XML_general, XML_left, XML_center, XML_right,
1236*b1cdbd2cSJim Jagielski XML_fill, XML_justify, XML_centerContinuous, XML_distributed };
1237*b1cdbd2cSJim Jagielski mnHorAlign = STATIC_ARRAY_SELECT( spnHorAligns, nHorAlign, XML_general );
1238*b1cdbd2cSJim Jagielski }
1239*b1cdbd2cSJim Jagielski
setBiffVerAlign(sal_uInt8 nVerAlign)1240*b1cdbd2cSJim Jagielski void AlignmentModel::setBiffVerAlign( sal_uInt8 nVerAlign )
1241*b1cdbd2cSJim Jagielski {
1242*b1cdbd2cSJim Jagielski static const sal_Int32 spnVerAligns[] = {
1243*b1cdbd2cSJim Jagielski XML_top, XML_center, XML_bottom, XML_justify, XML_distributed };
1244*b1cdbd2cSJim Jagielski mnVerAlign = STATIC_ARRAY_SELECT( spnVerAligns, nVerAlign, XML_bottom );
1245*b1cdbd2cSJim Jagielski }
1246*b1cdbd2cSJim Jagielski
setBiffTextOrient(sal_uInt8 nTextOrient)1247*b1cdbd2cSJim Jagielski void AlignmentModel::setBiffTextOrient( sal_uInt8 nTextOrient )
1248*b1cdbd2cSJim Jagielski {
1249*b1cdbd2cSJim Jagielski static const sal_Int32 spnRotations[] = {
1250*b1cdbd2cSJim Jagielski OOX_XF_ROTATION_NONE, OOX_XF_ROTATION_STACKED,
1251*b1cdbd2cSJim Jagielski OOX_XF_ROTATION_90CCW, OOX_XF_ROTATION_90CW };
1252*b1cdbd2cSJim Jagielski mnRotation = STATIC_ARRAY_SELECT( spnRotations, nTextOrient, OOX_XF_ROTATION_NONE );
1253*b1cdbd2cSJim Jagielski }
1254*b1cdbd2cSJim Jagielski
1255*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1256*b1cdbd2cSJim Jagielski
ApiAlignmentData()1257*b1cdbd2cSJim Jagielski ApiAlignmentData::ApiAlignmentData() :
1258*b1cdbd2cSJim Jagielski meHorJustify( ::com::sun::star::table::CellHoriJustify_STANDARD ),
1259*b1cdbd2cSJim Jagielski meVerJustify( ::com::sun::star::table::CellVertJustify_STANDARD ),
1260*b1cdbd2cSJim Jagielski meOrientation( ::com::sun::star::table::CellOrientation_STANDARD ),
1261*b1cdbd2cSJim Jagielski mnRotation( 0 ),
1262*b1cdbd2cSJim Jagielski mnWritingMode( ::com::sun::star::text::WritingMode2::PAGE ),
1263*b1cdbd2cSJim Jagielski mnIndent( 0 ),
1264*b1cdbd2cSJim Jagielski mbWrapText( false ),
1265*b1cdbd2cSJim Jagielski mbShrink( false )
1266*b1cdbd2cSJim Jagielski {
1267*b1cdbd2cSJim Jagielski }
1268*b1cdbd2cSJim Jagielski
operator ==(const ApiAlignmentData & rLeft,const ApiAlignmentData & rRight)1269*b1cdbd2cSJim Jagielski bool operator==( const ApiAlignmentData& rLeft, const ApiAlignmentData& rRight )
1270*b1cdbd2cSJim Jagielski {
1271*b1cdbd2cSJim Jagielski return
1272*b1cdbd2cSJim Jagielski (rLeft.meHorJustify == rRight.meHorJustify) &&
1273*b1cdbd2cSJim Jagielski (rLeft.meVerJustify == rRight.meVerJustify) &&
1274*b1cdbd2cSJim Jagielski (rLeft.meOrientation == rRight.meOrientation) &&
1275*b1cdbd2cSJim Jagielski (rLeft.mnRotation == rRight.mnRotation) &&
1276*b1cdbd2cSJim Jagielski (rLeft.mnWritingMode == rRight.mnWritingMode) &&
1277*b1cdbd2cSJim Jagielski (rLeft.mnIndent == rRight.mnIndent) &&
1278*b1cdbd2cSJim Jagielski (rLeft.mbWrapText == rRight.mbWrapText) &&
1279*b1cdbd2cSJim Jagielski (rLeft.mbShrink == rRight.mbShrink);
1280*b1cdbd2cSJim Jagielski }
1281*b1cdbd2cSJim Jagielski
1282*b1cdbd2cSJim Jagielski // ============================================================================
1283*b1cdbd2cSJim Jagielski
Alignment(const WorkbookHelper & rHelper)1284*b1cdbd2cSJim Jagielski Alignment::Alignment( const WorkbookHelper& rHelper ) :
1285*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper )
1286*b1cdbd2cSJim Jagielski {
1287*b1cdbd2cSJim Jagielski }
1288*b1cdbd2cSJim Jagielski
importAlignment(const AttributeList & rAttribs)1289*b1cdbd2cSJim Jagielski void Alignment::importAlignment( const AttributeList& rAttribs )
1290*b1cdbd2cSJim Jagielski {
1291*b1cdbd2cSJim Jagielski maModel.mnHorAlign = rAttribs.getToken( XML_horizontal, XML_general );
1292*b1cdbd2cSJim Jagielski maModel.mnVerAlign = rAttribs.getToken( XML_vertical, XML_bottom );
1293*b1cdbd2cSJim Jagielski maModel.mnTextDir = rAttribs.getInteger( XML_readingOrder, OOX_XF_TEXTDIR_CONTEXT );
1294*b1cdbd2cSJim Jagielski maModel.mnRotation = rAttribs.getInteger( XML_textRotation, OOX_XF_ROTATION_NONE );
1295*b1cdbd2cSJim Jagielski maModel.mnIndent = rAttribs.getInteger( XML_indent, OOX_XF_INDENT_NONE );
1296*b1cdbd2cSJim Jagielski maModel.mbWrapText = rAttribs.getBool( XML_wrapText, false );
1297*b1cdbd2cSJim Jagielski maModel.mbShrink = rAttribs.getBool( XML_shrinkToFit, false );
1298*b1cdbd2cSJim Jagielski maModel.mbJustLastLine = rAttribs.getBool( XML_justifyLastLine, false );
1299*b1cdbd2cSJim Jagielski }
1300*b1cdbd2cSJim Jagielski
setBiff12Data(sal_uInt32 nFlags)1301*b1cdbd2cSJim Jagielski void Alignment::setBiff12Data( sal_uInt32 nFlags )
1302*b1cdbd2cSJim Jagielski {
1303*b1cdbd2cSJim Jagielski maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nFlags, 16, 3 ) );
1304*b1cdbd2cSJim Jagielski maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nFlags, 19, 3 ) );
1305*b1cdbd2cSJim Jagielski maModel.mnTextDir = extractValue< sal_Int32 >( nFlags, 26, 2 );
1306*b1cdbd2cSJim Jagielski maModel.mnRotation = extractValue< sal_Int32 >( nFlags, 0, 8 );
1307*b1cdbd2cSJim Jagielski maModel.mnIndent = extractValue< sal_uInt8 >( nFlags, 8, 8 );
1308*b1cdbd2cSJim Jagielski maModel.mbWrapText = getFlag( nFlags, BIFF12_XF_WRAPTEXT );
1309*b1cdbd2cSJim Jagielski maModel.mbShrink = getFlag( nFlags, BIFF12_XF_SHRINK );
1310*b1cdbd2cSJim Jagielski maModel.mbJustLastLine = getFlag( nFlags, BIFF12_XF_JUSTLASTLINE );
1311*b1cdbd2cSJim Jagielski }
1312*b1cdbd2cSJim Jagielski
setBiff2Data(sal_uInt8 nFlags)1313*b1cdbd2cSJim Jagielski void Alignment::setBiff2Data( sal_uInt8 nFlags )
1314*b1cdbd2cSJim Jagielski {
1315*b1cdbd2cSJim Jagielski maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nFlags, 0, 3 ) );
1316*b1cdbd2cSJim Jagielski }
1317*b1cdbd2cSJim Jagielski
setBiff3Data(sal_uInt16 nAlign)1318*b1cdbd2cSJim Jagielski void Alignment::setBiff3Data( sal_uInt16 nAlign )
1319*b1cdbd2cSJim Jagielski {
1320*b1cdbd2cSJim Jagielski maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) );
1321*b1cdbd2cSJim Jagielski maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT ); // new in BIFF3
1322*b1cdbd2cSJim Jagielski }
1323*b1cdbd2cSJim Jagielski
setBiff4Data(sal_uInt16 nAlign)1324*b1cdbd2cSJim Jagielski void Alignment::setBiff4Data( sal_uInt16 nAlign )
1325*b1cdbd2cSJim Jagielski {
1326*b1cdbd2cSJim Jagielski maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) );
1327*b1cdbd2cSJim Jagielski maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 2 ) ); // new in BIFF4
1328*b1cdbd2cSJim Jagielski maModel.setBiffTextOrient( extractValue< sal_uInt8 >( nAlign, 6, 2 ) ); // new in BIFF4
1329*b1cdbd2cSJim Jagielski maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT );
1330*b1cdbd2cSJim Jagielski }
1331*b1cdbd2cSJim Jagielski
setBiff5Data(sal_uInt16 nAlign)1332*b1cdbd2cSJim Jagielski void Alignment::setBiff5Data( sal_uInt16 nAlign )
1333*b1cdbd2cSJim Jagielski {
1334*b1cdbd2cSJim Jagielski maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) );
1335*b1cdbd2cSJim Jagielski maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 3 ) );
1336*b1cdbd2cSJim Jagielski maModel.setBiffTextOrient( extractValue< sal_uInt8 >( nAlign, 8, 2 ) );
1337*b1cdbd2cSJim Jagielski maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT );
1338*b1cdbd2cSJim Jagielski }
1339*b1cdbd2cSJim Jagielski
setBiff8Data(sal_uInt16 nAlign,sal_uInt16 nMiscAttrib)1340*b1cdbd2cSJim Jagielski void Alignment::setBiff8Data( sal_uInt16 nAlign, sal_uInt16 nMiscAttrib )
1341*b1cdbd2cSJim Jagielski {
1342*b1cdbd2cSJim Jagielski maModel.setBiffHorAlign( extractValue< sal_uInt8 >( nAlign, 0, 3 ) );
1343*b1cdbd2cSJim Jagielski maModel.setBiffVerAlign( extractValue< sal_uInt8 >( nAlign, 4, 3 ) );
1344*b1cdbd2cSJim Jagielski maModel.mnTextDir = extractValue< sal_Int32 >( nMiscAttrib, 6, 2 ); // new in BIFF8
1345*b1cdbd2cSJim Jagielski maModel.mnRotation = extractValue< sal_Int32 >( nAlign, 8, 8 ); // new in BIFF8
1346*b1cdbd2cSJim Jagielski maModel.mnIndent = extractValue< sal_uInt8 >( nMiscAttrib, 0, 4 ); // new in BIFF8
1347*b1cdbd2cSJim Jagielski maModel.mbWrapText = getFlag( nAlign, BIFF_XF_WRAPTEXT );
1348*b1cdbd2cSJim Jagielski maModel.mbShrink = getFlag( nMiscAttrib, BIFF_XF_SHRINK ); // new in BIFF8
1349*b1cdbd2cSJim Jagielski maModel.mbJustLastLine = getFlag( nAlign, BIFF_XF_JUSTLASTLINE ); // new in BIFF8(?)
1350*b1cdbd2cSJim Jagielski }
1351*b1cdbd2cSJim Jagielski
finalizeImport()1352*b1cdbd2cSJim Jagielski void Alignment::finalizeImport()
1353*b1cdbd2cSJim Jagielski {
1354*b1cdbd2cSJim Jagielski namespace csstab = ::com::sun::star::table;
1355*b1cdbd2cSJim Jagielski namespace csstxt = ::com::sun::star::text;
1356*b1cdbd2cSJim Jagielski
1357*b1cdbd2cSJim Jagielski // horizontal alignment
1358*b1cdbd2cSJim Jagielski switch( maModel.mnHorAlign )
1359*b1cdbd2cSJim Jagielski {
1360*b1cdbd2cSJim Jagielski case XML_center: maApiData.meHorJustify = csstab::CellHoriJustify_CENTER; break;
1361*b1cdbd2cSJim Jagielski case XML_centerContinuous: maApiData.meHorJustify = csstab::CellHoriJustify_CENTER; break;
1362*b1cdbd2cSJim Jagielski case XML_distributed: maApiData.meHorJustify = csstab::CellHoriJustify_BLOCK; break;
1363*b1cdbd2cSJim Jagielski case XML_fill: maApiData.meHorJustify = csstab::CellHoriJustify_REPEAT; break;
1364*b1cdbd2cSJim Jagielski case XML_general: maApiData.meHorJustify = csstab::CellHoriJustify_STANDARD; break;
1365*b1cdbd2cSJim Jagielski case XML_justify: maApiData.meHorJustify = csstab::CellHoriJustify_BLOCK; break;
1366*b1cdbd2cSJim Jagielski case XML_left: maApiData.meHorJustify = csstab::CellHoriJustify_LEFT; break;
1367*b1cdbd2cSJim Jagielski case XML_right: maApiData.meHorJustify = csstab::CellHoriJustify_RIGHT; break;
1368*b1cdbd2cSJim Jagielski }
1369*b1cdbd2cSJim Jagielski
1370*b1cdbd2cSJim Jagielski // vertical alignment
1371*b1cdbd2cSJim Jagielski switch( maModel.mnVerAlign )
1372*b1cdbd2cSJim Jagielski {
1373*b1cdbd2cSJim Jagielski case XML_bottom: maApiData.meVerJustify = csstab::CellVertJustify_BOTTOM; break;
1374*b1cdbd2cSJim Jagielski case XML_center: maApiData.meVerJustify = csstab::CellVertJustify_CENTER; break;
1375*b1cdbd2cSJim Jagielski case XML_distributed: maApiData.meVerJustify = csstab::CellVertJustify_TOP; break;
1376*b1cdbd2cSJim Jagielski case XML_justify: maApiData.meVerJustify = csstab::CellVertJustify_TOP; break;
1377*b1cdbd2cSJim Jagielski case XML_top: maApiData.meVerJustify = csstab::CellVertJustify_TOP; break;
1378*b1cdbd2cSJim Jagielski }
1379*b1cdbd2cSJim Jagielski
1380*b1cdbd2cSJim Jagielski /* indentation: expressed as number of blocks of 3 space characters in
1381*b1cdbd2cSJim Jagielski OOXML/BIFF12, and as multiple of 10 points in BIFF8. */
1382*b1cdbd2cSJim Jagielski sal_Int32 nIndent = 0;
1383*b1cdbd2cSJim Jagielski switch( getFilterType() )
1384*b1cdbd2cSJim Jagielski {
1385*b1cdbd2cSJim Jagielski case FILTER_OOXML: nIndent = getUnitConverter().scaleToMm100( 3.0 * maModel.mnIndent, UNIT_SPACE ); break;
1386*b1cdbd2cSJim Jagielski case FILTER_BIFF: nIndent = getUnitConverter().scaleToMm100( 10.0 * maModel.mnIndent, UNIT_POINT ); break;
1387*b1cdbd2cSJim Jagielski case FILTER_UNKNOWN: break;
1388*b1cdbd2cSJim Jagielski }
1389*b1cdbd2cSJim Jagielski if( (0 <= nIndent) && (nIndent <= SAL_MAX_INT16) )
1390*b1cdbd2cSJim Jagielski maApiData.mnIndent = static_cast< sal_Int16 >( nIndent );
1391*b1cdbd2cSJim Jagielski
1392*b1cdbd2cSJim Jagielski // complex text direction
1393*b1cdbd2cSJim Jagielski switch( maModel.mnTextDir )
1394*b1cdbd2cSJim Jagielski {
1395*b1cdbd2cSJim Jagielski case OOX_XF_TEXTDIR_CONTEXT: maApiData.mnWritingMode = csstxt::WritingMode2::PAGE; break;
1396*b1cdbd2cSJim Jagielski case OOX_XF_TEXTDIR_LTR: maApiData.mnWritingMode = csstxt::WritingMode2::LR_TB; break;
1397*b1cdbd2cSJim Jagielski case OOX_XF_TEXTDIR_RTL: maApiData.mnWritingMode = csstxt::WritingMode2::RL_TB; break;
1398*b1cdbd2cSJim Jagielski }
1399*b1cdbd2cSJim Jagielski
1400*b1cdbd2cSJim Jagielski // rotation: 0-90 means 0 to 90 degrees ccw, 91-180 means 1 to 90 degrees cw, 255 means stacked
1401*b1cdbd2cSJim Jagielski sal_Int32 nOoxRot = maModel.mnRotation;
1402*b1cdbd2cSJim Jagielski maApiData.mnRotation = ((0 <= nOoxRot) && (nOoxRot <= 90)) ?
1403*b1cdbd2cSJim Jagielski (100 * nOoxRot) :
1404*b1cdbd2cSJim Jagielski (((91 <= nOoxRot) && (nOoxRot <= 180)) ? (100 * (450 - nOoxRot)) : 0);
1405*b1cdbd2cSJim Jagielski
1406*b1cdbd2cSJim Jagielski // "Orientation" property used for character stacking
1407*b1cdbd2cSJim Jagielski maApiData.meOrientation = (nOoxRot == OOX_XF_ROTATION_STACKED) ?
1408*b1cdbd2cSJim Jagielski csstab::CellOrientation_STACKED : csstab::CellOrientation_STANDARD;
1409*b1cdbd2cSJim Jagielski
1410*b1cdbd2cSJim Jagielski // alignment flags (#i84960 automatic line break, if vertically justified/distributed)
1411*b1cdbd2cSJim Jagielski maApiData.mbWrapText = maModel.mbWrapText || (maModel.mnVerAlign == XML_distributed) || (maModel.mnVerAlign == XML_justify);
1412*b1cdbd2cSJim Jagielski maApiData.mbShrink = maModel.mbShrink;
1413*b1cdbd2cSJim Jagielski
1414*b1cdbd2cSJim Jagielski }
1415*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap) const1416*b1cdbd2cSJim Jagielski void Alignment::writeToPropertyMap( PropertyMap& rPropMap ) const
1417*b1cdbd2cSJim Jagielski {
1418*b1cdbd2cSJim Jagielski rPropMap[ PROP_HoriJustify ] <<= maApiData.meHorJustify;
1419*b1cdbd2cSJim Jagielski rPropMap[ PROP_VertJustify ] <<= maApiData.meVerJustify;
1420*b1cdbd2cSJim Jagielski rPropMap[ PROP_WritingMode ] <<= maApiData.mnWritingMode;
1421*b1cdbd2cSJim Jagielski rPropMap[ PROP_RotateAngle ] <<= maApiData.mnRotation;
1422*b1cdbd2cSJim Jagielski rPropMap[ PROP_Orientation ] <<= maApiData.meOrientation;
1423*b1cdbd2cSJim Jagielski rPropMap[ PROP_ParaIndent ] <<= maApiData.mnIndent;
1424*b1cdbd2cSJim Jagielski rPropMap[ PROP_IsTextWrapped ] <<= maApiData.mbWrapText;
1425*b1cdbd2cSJim Jagielski rPropMap[ PROP_ShrinkToFit ] <<= maApiData.mbShrink;
1426*b1cdbd2cSJim Jagielski }
1427*b1cdbd2cSJim Jagielski
1428*b1cdbd2cSJim Jagielski // ============================================================================
1429*b1cdbd2cSJim Jagielski
ProtectionModel()1430*b1cdbd2cSJim Jagielski ProtectionModel::ProtectionModel() :
1431*b1cdbd2cSJim Jagielski mbLocked( true ), // default in Excel and Calc
1432*b1cdbd2cSJim Jagielski mbHidden( false )
1433*b1cdbd2cSJim Jagielski {
1434*b1cdbd2cSJim Jagielski }
1435*b1cdbd2cSJim Jagielski
1436*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1437*b1cdbd2cSJim Jagielski
ApiProtectionData()1438*b1cdbd2cSJim Jagielski ApiProtectionData::ApiProtectionData() :
1439*b1cdbd2cSJim Jagielski maCellProt( sal_True, sal_False, sal_False, sal_False )
1440*b1cdbd2cSJim Jagielski {
1441*b1cdbd2cSJim Jagielski }
1442*b1cdbd2cSJim Jagielski
operator ==(const ApiProtectionData & rLeft,const ApiProtectionData & rRight)1443*b1cdbd2cSJim Jagielski bool operator==( const ApiProtectionData& rLeft, const ApiProtectionData& rRight )
1444*b1cdbd2cSJim Jagielski {
1445*b1cdbd2cSJim Jagielski return
1446*b1cdbd2cSJim Jagielski (rLeft.maCellProt.IsLocked == rRight.maCellProt.IsLocked) &&
1447*b1cdbd2cSJim Jagielski (rLeft.maCellProt.IsFormulaHidden == rRight.maCellProt.IsFormulaHidden) &&
1448*b1cdbd2cSJim Jagielski (rLeft.maCellProt.IsHidden == rRight.maCellProt.IsHidden) &&
1449*b1cdbd2cSJim Jagielski (rLeft.maCellProt.IsPrintHidden == rRight.maCellProt.IsPrintHidden);
1450*b1cdbd2cSJim Jagielski }
1451*b1cdbd2cSJim Jagielski
1452*b1cdbd2cSJim Jagielski // ============================================================================
1453*b1cdbd2cSJim Jagielski
Protection(const WorkbookHelper & rHelper)1454*b1cdbd2cSJim Jagielski Protection::Protection( const WorkbookHelper& rHelper ) :
1455*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper )
1456*b1cdbd2cSJim Jagielski {
1457*b1cdbd2cSJim Jagielski }
1458*b1cdbd2cSJim Jagielski
importProtection(const AttributeList & rAttribs)1459*b1cdbd2cSJim Jagielski void Protection::importProtection( const AttributeList& rAttribs )
1460*b1cdbd2cSJim Jagielski {
1461*b1cdbd2cSJim Jagielski maModel.mbLocked = rAttribs.getBool( XML_locked, true );
1462*b1cdbd2cSJim Jagielski maModel.mbHidden = rAttribs.getBool( XML_hidden, false );
1463*b1cdbd2cSJim Jagielski }
1464*b1cdbd2cSJim Jagielski
setBiff12Data(sal_uInt32 nFlags)1465*b1cdbd2cSJim Jagielski void Protection::setBiff12Data( sal_uInt32 nFlags )
1466*b1cdbd2cSJim Jagielski {
1467*b1cdbd2cSJim Jagielski maModel.mbLocked = getFlag( nFlags, BIFF12_XF_LOCKED );
1468*b1cdbd2cSJim Jagielski maModel.mbHidden = getFlag( nFlags, BIFF12_XF_HIDDEN );
1469*b1cdbd2cSJim Jagielski }
1470*b1cdbd2cSJim Jagielski
setBiff2Data(sal_uInt8 nNumFmt)1471*b1cdbd2cSJim Jagielski void Protection::setBiff2Data( sal_uInt8 nNumFmt )
1472*b1cdbd2cSJim Jagielski {
1473*b1cdbd2cSJim Jagielski maModel.mbLocked = getFlag( nNumFmt, BIFF2_XF_LOCKED );
1474*b1cdbd2cSJim Jagielski maModel.mbHidden = getFlag( nNumFmt, BIFF2_XF_HIDDEN );
1475*b1cdbd2cSJim Jagielski }
1476*b1cdbd2cSJim Jagielski
setBiff3Data(sal_uInt16 nProt)1477*b1cdbd2cSJim Jagielski void Protection::setBiff3Data( sal_uInt16 nProt )
1478*b1cdbd2cSJim Jagielski {
1479*b1cdbd2cSJim Jagielski maModel.mbLocked = getFlag( nProt, BIFF_XF_LOCKED );
1480*b1cdbd2cSJim Jagielski maModel.mbHidden = getFlag( nProt, BIFF_XF_HIDDEN );
1481*b1cdbd2cSJim Jagielski }
1482*b1cdbd2cSJim Jagielski
finalizeImport()1483*b1cdbd2cSJim Jagielski void Protection::finalizeImport()
1484*b1cdbd2cSJim Jagielski {
1485*b1cdbd2cSJim Jagielski maApiData.maCellProt.IsLocked = maModel.mbLocked;
1486*b1cdbd2cSJim Jagielski maApiData.maCellProt.IsFormulaHidden = maModel.mbHidden;
1487*b1cdbd2cSJim Jagielski }
1488*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap) const1489*b1cdbd2cSJim Jagielski void Protection::writeToPropertyMap( PropertyMap& rPropMap ) const
1490*b1cdbd2cSJim Jagielski {
1491*b1cdbd2cSJim Jagielski rPropMap[ PROP_CellProtection ] <<= maApiData.maCellProt;
1492*b1cdbd2cSJim Jagielski }
1493*b1cdbd2cSJim Jagielski
1494*b1cdbd2cSJim Jagielski // ============================================================================
1495*b1cdbd2cSJim Jagielski
BorderLineModel(bool bDxf)1496*b1cdbd2cSJim Jagielski BorderLineModel::BorderLineModel( bool bDxf ) :
1497*b1cdbd2cSJim Jagielski mnStyle( XML_none ),
1498*b1cdbd2cSJim Jagielski mbUsed( !bDxf )
1499*b1cdbd2cSJim Jagielski {
1500*b1cdbd2cSJim Jagielski maColor.setIndexed( OOX_COLOR_WINDOWTEXT );
1501*b1cdbd2cSJim Jagielski }
1502*b1cdbd2cSJim Jagielski
setBiffStyle(sal_Int32 nLineStyle)1503*b1cdbd2cSJim Jagielski void BorderLineModel::setBiffStyle( sal_Int32 nLineStyle )
1504*b1cdbd2cSJim Jagielski {
1505*b1cdbd2cSJim Jagielski static const sal_Int32 spnStyleIds[] = {
1506*b1cdbd2cSJim Jagielski XML_none, XML_thin, XML_medium, XML_dashed,
1507*b1cdbd2cSJim Jagielski XML_dotted, XML_thick, XML_double, XML_hair,
1508*b1cdbd2cSJim Jagielski XML_mediumDashed, XML_dashDot, XML_mediumDashDot, XML_dashDotDot,
1509*b1cdbd2cSJim Jagielski XML_mediumDashDotDot, XML_slantDashDot };
1510*b1cdbd2cSJim Jagielski mnStyle = STATIC_ARRAY_SELECT( spnStyleIds, nLineStyle, XML_none );
1511*b1cdbd2cSJim Jagielski }
1512*b1cdbd2cSJim Jagielski
setBiffData(sal_uInt8 nLineStyle,sal_uInt16 nLineColor)1513*b1cdbd2cSJim Jagielski void BorderLineModel::setBiffData( sal_uInt8 nLineStyle, sal_uInt16 nLineColor )
1514*b1cdbd2cSJim Jagielski {
1515*b1cdbd2cSJim Jagielski maColor.setIndexed( nLineColor );
1516*b1cdbd2cSJim Jagielski setBiffStyle( nLineStyle );
1517*b1cdbd2cSJim Jagielski }
1518*b1cdbd2cSJim Jagielski
1519*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1520*b1cdbd2cSJim Jagielski
BorderModel(bool bDxf)1521*b1cdbd2cSJim Jagielski BorderModel::BorderModel( bool bDxf ) :
1522*b1cdbd2cSJim Jagielski maLeft( bDxf ),
1523*b1cdbd2cSJim Jagielski maRight( bDxf ),
1524*b1cdbd2cSJim Jagielski maTop( bDxf ),
1525*b1cdbd2cSJim Jagielski maBottom( bDxf ),
1526*b1cdbd2cSJim Jagielski maDiagonal( bDxf ),
1527*b1cdbd2cSJim Jagielski mbDiagTLtoBR( false ),
1528*b1cdbd2cSJim Jagielski mbDiagBLtoTR( false )
1529*b1cdbd2cSJim Jagielski {
1530*b1cdbd2cSJim Jagielski }
1531*b1cdbd2cSJim Jagielski
1532*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1533*b1cdbd2cSJim Jagielski
ApiBorderData()1534*b1cdbd2cSJim Jagielski ApiBorderData::ApiBorderData() :
1535*b1cdbd2cSJim Jagielski mbBorderUsed( false ),
1536*b1cdbd2cSJim Jagielski mbDiagUsed( false )
1537*b1cdbd2cSJim Jagielski {
1538*b1cdbd2cSJim Jagielski }
1539*b1cdbd2cSJim Jagielski
hasAnyOuterBorder() const1540*b1cdbd2cSJim Jagielski bool ApiBorderData::hasAnyOuterBorder() const
1541*b1cdbd2cSJim Jagielski {
1542*b1cdbd2cSJim Jagielski return
1543*b1cdbd2cSJim Jagielski (maBorder.IsTopLineValid && (maBorder.TopLine.OuterLineWidth > 0)) ||
1544*b1cdbd2cSJim Jagielski (maBorder.IsBottomLineValid && (maBorder.BottomLine.OuterLineWidth > 0)) ||
1545*b1cdbd2cSJim Jagielski (maBorder.IsLeftLineValid && (maBorder.LeftLine.OuterLineWidth > 0)) ||
1546*b1cdbd2cSJim Jagielski (maBorder.IsRightLineValid && (maBorder.RightLine.OuterLineWidth > 0));
1547*b1cdbd2cSJim Jagielski }
1548*b1cdbd2cSJim Jagielski
1549*b1cdbd2cSJim Jagielski namespace {
1550*b1cdbd2cSJim Jagielski
operator ==(const BorderLine & rLeft,const BorderLine & rRight)1551*b1cdbd2cSJim Jagielski bool operator==( const BorderLine& rLeft, const BorderLine& rRight )
1552*b1cdbd2cSJim Jagielski {
1553*b1cdbd2cSJim Jagielski return
1554*b1cdbd2cSJim Jagielski (rLeft.Color == rRight.Color) &&
1555*b1cdbd2cSJim Jagielski (rLeft.InnerLineWidth == rRight.InnerLineWidth) &&
1556*b1cdbd2cSJim Jagielski (rLeft.OuterLineWidth == rRight.OuterLineWidth) &&
1557*b1cdbd2cSJim Jagielski (rLeft.LineDistance == rRight.LineDistance);
1558*b1cdbd2cSJim Jagielski }
1559*b1cdbd2cSJim Jagielski
operator ==(const TableBorder & rLeft,const TableBorder & rRight)1560*b1cdbd2cSJim Jagielski bool operator==( const TableBorder& rLeft, const TableBorder& rRight )
1561*b1cdbd2cSJim Jagielski {
1562*b1cdbd2cSJim Jagielski return
1563*b1cdbd2cSJim Jagielski (rLeft.TopLine == rRight.TopLine) &&
1564*b1cdbd2cSJim Jagielski (rLeft.IsTopLineValid == rRight.IsTopLineValid) &&
1565*b1cdbd2cSJim Jagielski (rLeft.BottomLine == rRight.BottomLine) &&
1566*b1cdbd2cSJim Jagielski (rLeft.IsBottomLineValid == rRight.IsBottomLineValid) &&
1567*b1cdbd2cSJim Jagielski (rLeft.LeftLine == rRight.LeftLine) &&
1568*b1cdbd2cSJim Jagielski (rLeft.IsLeftLineValid == rRight.IsLeftLineValid) &&
1569*b1cdbd2cSJim Jagielski (rLeft.RightLine == rRight.RightLine) &&
1570*b1cdbd2cSJim Jagielski (rLeft.IsRightLineValid == rRight.IsRightLineValid) &&
1571*b1cdbd2cSJim Jagielski (rLeft.HorizontalLine == rRight.HorizontalLine) &&
1572*b1cdbd2cSJim Jagielski (rLeft.IsHorizontalLineValid == rRight.IsHorizontalLineValid) &&
1573*b1cdbd2cSJim Jagielski (rLeft.VerticalLine == rRight.VerticalLine) &&
1574*b1cdbd2cSJim Jagielski (rLeft.IsVerticalLineValid == rRight.IsVerticalLineValid) &&
1575*b1cdbd2cSJim Jagielski (rLeft.Distance == rRight.Distance) &&
1576*b1cdbd2cSJim Jagielski (rLeft.IsDistanceValid == rRight.IsDistanceValid);
1577*b1cdbd2cSJim Jagielski }
1578*b1cdbd2cSJim Jagielski
1579*b1cdbd2cSJim Jagielski } // namespace
1580*b1cdbd2cSJim Jagielski
operator ==(const ApiBorderData & rLeft,const ApiBorderData & rRight)1581*b1cdbd2cSJim Jagielski bool operator==( const ApiBorderData& rLeft, const ApiBorderData& rRight )
1582*b1cdbd2cSJim Jagielski {
1583*b1cdbd2cSJim Jagielski return
1584*b1cdbd2cSJim Jagielski (rLeft.maBorder == rRight.maBorder) &&
1585*b1cdbd2cSJim Jagielski (rLeft.maTLtoBR == rRight.maTLtoBR) &&
1586*b1cdbd2cSJim Jagielski (rLeft.maBLtoTR == rRight.maBLtoTR) &&
1587*b1cdbd2cSJim Jagielski (rLeft.mbBorderUsed == rRight.mbBorderUsed) &&
1588*b1cdbd2cSJim Jagielski (rLeft.mbDiagUsed == rRight.mbDiagUsed);
1589*b1cdbd2cSJim Jagielski }
1590*b1cdbd2cSJim Jagielski
1591*b1cdbd2cSJim Jagielski // ============================================================================
1592*b1cdbd2cSJim Jagielski
1593*b1cdbd2cSJim Jagielski namespace {
1594*b1cdbd2cSJim Jagielski
lclSetBorderLineWidth(BorderLine & rBorderLine,sal_Int16 nOuter,sal_Int16 nDist=API_LINE_NONE,sal_Int16 nInner=API_LINE_NONE)1595*b1cdbd2cSJim Jagielski inline void lclSetBorderLineWidth( BorderLine& rBorderLine,
1596*b1cdbd2cSJim Jagielski sal_Int16 nOuter, sal_Int16 nDist = API_LINE_NONE, sal_Int16 nInner = API_LINE_NONE )
1597*b1cdbd2cSJim Jagielski {
1598*b1cdbd2cSJim Jagielski rBorderLine.OuterLineWidth = nOuter;
1599*b1cdbd2cSJim Jagielski rBorderLine.LineDistance = nDist;
1600*b1cdbd2cSJim Jagielski rBorderLine.InnerLineWidth = nInner;
1601*b1cdbd2cSJim Jagielski }
1602*b1cdbd2cSJim Jagielski
lclGetBorderLineWidth(const BorderLine & rBorderLine)1603*b1cdbd2cSJim Jagielski inline sal_Int32 lclGetBorderLineWidth( const BorderLine& rBorderLine )
1604*b1cdbd2cSJim Jagielski {
1605*b1cdbd2cSJim Jagielski return rBorderLine.OuterLineWidth + rBorderLine.LineDistance + rBorderLine.InnerLineWidth;
1606*b1cdbd2cSJim Jagielski }
1607*b1cdbd2cSJim Jagielski
lclGetThickerLine(const BorderLine & rBorderLine1,sal_Bool bValid1,const BorderLine & rBorderLine2,sal_Bool bValid2)1608*b1cdbd2cSJim Jagielski const BorderLine* lclGetThickerLine( const BorderLine& rBorderLine1, sal_Bool bValid1, const BorderLine& rBorderLine2, sal_Bool bValid2 )
1609*b1cdbd2cSJim Jagielski {
1610*b1cdbd2cSJim Jagielski if( bValid1 && bValid2 )
1611*b1cdbd2cSJim Jagielski return (lclGetBorderLineWidth( rBorderLine1 ) < lclGetBorderLineWidth( rBorderLine2 )) ? &rBorderLine2 : &rBorderLine1;
1612*b1cdbd2cSJim Jagielski if( bValid1 )
1613*b1cdbd2cSJim Jagielski return &rBorderLine1;
1614*b1cdbd2cSJim Jagielski if( bValid2 )
1615*b1cdbd2cSJim Jagielski return &rBorderLine2;
1616*b1cdbd2cSJim Jagielski return 0;
1617*b1cdbd2cSJim Jagielski }
1618*b1cdbd2cSJim Jagielski
1619*b1cdbd2cSJim Jagielski } // namespace
1620*b1cdbd2cSJim Jagielski
1621*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1622*b1cdbd2cSJim Jagielski
Border(const WorkbookHelper & rHelper,bool bDxf)1623*b1cdbd2cSJim Jagielski Border::Border( const WorkbookHelper& rHelper, bool bDxf ) :
1624*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
1625*b1cdbd2cSJim Jagielski maModel( bDxf ),
1626*b1cdbd2cSJim Jagielski mbDxf( bDxf )
1627*b1cdbd2cSJim Jagielski {
1628*b1cdbd2cSJim Jagielski }
1629*b1cdbd2cSJim Jagielski
importBorder(const AttributeList & rAttribs)1630*b1cdbd2cSJim Jagielski void Border::importBorder( const AttributeList& rAttribs )
1631*b1cdbd2cSJim Jagielski {
1632*b1cdbd2cSJim Jagielski maModel.mbDiagTLtoBR = rAttribs.getBool( XML_diagonalDown, false );
1633*b1cdbd2cSJim Jagielski maModel.mbDiagBLtoTR = rAttribs.getBool( XML_diagonalUp, false );
1634*b1cdbd2cSJim Jagielski }
1635*b1cdbd2cSJim Jagielski
importStyle(sal_Int32 nElement,const AttributeList & rAttribs)1636*b1cdbd2cSJim Jagielski void Border::importStyle( sal_Int32 nElement, const AttributeList& rAttribs )
1637*b1cdbd2cSJim Jagielski {
1638*b1cdbd2cSJim Jagielski if( BorderLineModel* pBorderLine = getBorderLine( nElement ) )
1639*b1cdbd2cSJim Jagielski {
1640*b1cdbd2cSJim Jagielski pBorderLine->mnStyle = rAttribs.getToken( XML_style, XML_none );
1641*b1cdbd2cSJim Jagielski pBorderLine->mbUsed = true;
1642*b1cdbd2cSJim Jagielski }
1643*b1cdbd2cSJim Jagielski }
1644*b1cdbd2cSJim Jagielski
importColor(sal_Int32 nElement,const AttributeList & rAttribs)1645*b1cdbd2cSJim Jagielski void Border::importColor( sal_Int32 nElement, const AttributeList& rAttribs )
1646*b1cdbd2cSJim Jagielski {
1647*b1cdbd2cSJim Jagielski if( BorderLineModel* pBorderLine = getBorderLine( nElement ) )
1648*b1cdbd2cSJim Jagielski pBorderLine->maColor.importColor( rAttribs );
1649*b1cdbd2cSJim Jagielski }
1650*b1cdbd2cSJim Jagielski
importBorder(SequenceInputStream & rStrm)1651*b1cdbd2cSJim Jagielski void Border::importBorder( SequenceInputStream& rStrm )
1652*b1cdbd2cSJim Jagielski {
1653*b1cdbd2cSJim Jagielski sal_uInt8 nFlags = rStrm.readuInt8();
1654*b1cdbd2cSJim Jagielski maModel.mbDiagTLtoBR = getFlag( nFlags, BIFF12_BORDER_DIAG_TLBR );
1655*b1cdbd2cSJim Jagielski maModel.mbDiagBLtoTR = getFlag( nFlags, BIFF12_BORDER_DIAG_BLTR );
1656*b1cdbd2cSJim Jagielski maModel.maTop.setBiffStyle( rStrm.readuInt16() );
1657*b1cdbd2cSJim Jagielski rStrm >> maModel.maTop.maColor;
1658*b1cdbd2cSJim Jagielski maModel.maBottom.setBiffStyle( rStrm.readuInt16() );
1659*b1cdbd2cSJim Jagielski rStrm >> maModel.maBottom.maColor;
1660*b1cdbd2cSJim Jagielski maModel.maLeft.setBiffStyle( rStrm.readuInt16() );
1661*b1cdbd2cSJim Jagielski rStrm >> maModel.maLeft.maColor;
1662*b1cdbd2cSJim Jagielski maModel.maRight.setBiffStyle( rStrm.readuInt16() );
1663*b1cdbd2cSJim Jagielski rStrm >> maModel.maRight.maColor;
1664*b1cdbd2cSJim Jagielski maModel.maDiagonal.setBiffStyle( rStrm.readuInt16() );
1665*b1cdbd2cSJim Jagielski rStrm >> maModel.maDiagonal.maColor;
1666*b1cdbd2cSJim Jagielski }
1667*b1cdbd2cSJim Jagielski
importDxfBorder(sal_Int32 nElement,SequenceInputStream & rStrm)1668*b1cdbd2cSJim Jagielski void Border::importDxfBorder( sal_Int32 nElement, SequenceInputStream& rStrm )
1669*b1cdbd2cSJim Jagielski {
1670*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Border::importDxfBorder - missing conditional formatting flag" );
1671*b1cdbd2cSJim Jagielski if( BorderLineModel* pBorderLine = getBorderLine( nElement ) )
1672*b1cdbd2cSJim Jagielski {
1673*b1cdbd2cSJim Jagielski sal_uInt16 nStyle;
1674*b1cdbd2cSJim Jagielski rStrm >> pBorderLine->maColor >> nStyle;
1675*b1cdbd2cSJim Jagielski pBorderLine->setBiffStyle( nStyle );
1676*b1cdbd2cSJim Jagielski pBorderLine->mbUsed = true;
1677*b1cdbd2cSJim Jagielski }
1678*b1cdbd2cSJim Jagielski }
1679*b1cdbd2cSJim Jagielski
setBiff2Data(sal_uInt8 nFlags)1680*b1cdbd2cSJim Jagielski void Border::setBiff2Data( sal_uInt8 nFlags )
1681*b1cdbd2cSJim Jagielski {
1682*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Border::setBiff2Data - unexpected conditional formatting flag" );
1683*b1cdbd2cSJim Jagielski maModel.maLeft.setBiffData( getFlagValue( nFlags, BIFF2_XF_LEFTLINE, BIFF_LINE_THIN, BIFF_LINE_NONE ), BIFF2_COLOR_BLACK );
1684*b1cdbd2cSJim Jagielski maModel.maRight.setBiffData( getFlagValue( nFlags, BIFF2_XF_RIGHTLINE, BIFF_LINE_THIN, BIFF_LINE_NONE ), BIFF2_COLOR_BLACK );
1685*b1cdbd2cSJim Jagielski maModel.maTop.setBiffData( getFlagValue( nFlags, BIFF2_XF_TOPLINE, BIFF_LINE_THIN, BIFF_LINE_NONE ), BIFF2_COLOR_BLACK );
1686*b1cdbd2cSJim Jagielski maModel.maBottom.setBiffData( getFlagValue( nFlags, BIFF2_XF_BOTTOMLINE, BIFF_LINE_THIN, BIFF_LINE_NONE ), BIFF2_COLOR_BLACK );
1687*b1cdbd2cSJim Jagielski maModel.maDiagonal.mbUsed = false;
1688*b1cdbd2cSJim Jagielski }
1689*b1cdbd2cSJim Jagielski
setBiff3Data(sal_uInt32 nBorder)1690*b1cdbd2cSJim Jagielski void Border::setBiff3Data( sal_uInt32 nBorder )
1691*b1cdbd2cSJim Jagielski {
1692*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Border::setBiff3Data - unexpected conditional formatting flag" );
1693*b1cdbd2cSJim Jagielski maModel.maLeft.setBiffData( extractValue< sal_uInt8 >( nBorder, 8, 3 ), extractValue< sal_uInt16 >( nBorder, 11, 5 ) );
1694*b1cdbd2cSJim Jagielski maModel.maRight.setBiffData( extractValue< sal_uInt8 >( nBorder, 24, 3 ), extractValue< sal_uInt16 >( nBorder, 27, 5 ) );
1695*b1cdbd2cSJim Jagielski maModel.maTop.setBiffData( extractValue< sal_uInt8 >( nBorder, 0, 3 ), extractValue< sal_uInt16 >( nBorder, 3, 5 ) );
1696*b1cdbd2cSJim Jagielski maModel.maBottom.setBiffData( extractValue< sal_uInt8 >( nBorder, 16, 3 ), extractValue< sal_uInt16 >( nBorder, 19, 5 ) );
1697*b1cdbd2cSJim Jagielski maModel.maDiagonal.mbUsed = false;
1698*b1cdbd2cSJim Jagielski }
1699*b1cdbd2cSJim Jagielski
setBiff5Data(sal_uInt32 nBorder,sal_uInt32 nArea)1700*b1cdbd2cSJim Jagielski void Border::setBiff5Data( sal_uInt32 nBorder, sal_uInt32 nArea )
1701*b1cdbd2cSJim Jagielski {
1702*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Border::setBiff5Data - unexpected conditional formatting flag" );
1703*b1cdbd2cSJim Jagielski maModel.maLeft.setBiffData( extractValue< sal_uInt8 >( nBorder, 3, 3 ), extractValue< sal_uInt16 >( nBorder, 16, 7 ) );
1704*b1cdbd2cSJim Jagielski maModel.maRight.setBiffData( extractValue< sal_uInt8 >( nBorder, 6, 3 ), extractValue< sal_uInt16 >( nBorder, 23, 7 ) );
1705*b1cdbd2cSJim Jagielski maModel.maTop.setBiffData( extractValue< sal_uInt8 >( nBorder, 0, 3 ), extractValue< sal_uInt16 >( nBorder, 9, 7 ) );
1706*b1cdbd2cSJim Jagielski maModel.maBottom.setBiffData( extractValue< sal_uInt8 >( nArea, 22, 3 ), extractValue< sal_uInt16 >( nArea, 25, 7 ) );
1707*b1cdbd2cSJim Jagielski maModel.maDiagonal.mbUsed = false;
1708*b1cdbd2cSJim Jagielski }
1709*b1cdbd2cSJim Jagielski
setBiff8Data(sal_uInt32 nBorder1,sal_uInt32 nBorder2)1710*b1cdbd2cSJim Jagielski void Border::setBiff8Data( sal_uInt32 nBorder1, sal_uInt32 nBorder2 )
1711*b1cdbd2cSJim Jagielski {
1712*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Border::setBiff8Data - unexpected conditional formatting flag" );
1713*b1cdbd2cSJim Jagielski maModel.maLeft.setBiffData( extractValue< sal_uInt8 >( nBorder1, 0, 4 ), extractValue< sal_uInt16 >( nBorder1, 16, 7 ) );
1714*b1cdbd2cSJim Jagielski maModel.maRight.setBiffData( extractValue< sal_uInt8 >( nBorder1, 4, 4 ), extractValue< sal_uInt16 >( nBorder1, 23, 7 ) );
1715*b1cdbd2cSJim Jagielski maModel.maTop.setBiffData( extractValue< sal_uInt8 >( nBorder1, 8, 4 ), extractValue< sal_uInt16 >( nBorder2, 0, 7 ) );
1716*b1cdbd2cSJim Jagielski maModel.maBottom.setBiffData( extractValue< sal_uInt8 >( nBorder1, 12, 4 ), extractValue< sal_uInt16 >( nBorder2, 7, 7 ) );
1717*b1cdbd2cSJim Jagielski maModel.mbDiagTLtoBR = getFlag( nBorder1, BIFF_XF_DIAG_TLBR );
1718*b1cdbd2cSJim Jagielski maModel.mbDiagBLtoTR = getFlag( nBorder1, BIFF_XF_DIAG_BLTR );
1719*b1cdbd2cSJim Jagielski if( maModel.mbDiagTLtoBR || maModel.mbDiagBLtoTR )
1720*b1cdbd2cSJim Jagielski maModel.maDiagonal.setBiffData( extractValue< sal_uInt8 >( nBorder2, 21, 4 ), extractValue< sal_uInt16 >( nBorder2, 14, 7 ) );
1721*b1cdbd2cSJim Jagielski }
1722*b1cdbd2cSJim Jagielski
importCfRule(BiffInputStream & rStrm,sal_uInt32 nFlags)1723*b1cdbd2cSJim Jagielski void Border::importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags )
1724*b1cdbd2cSJim Jagielski {
1725*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Border::importCfRule - missing conditional formatting flag" );
1726*b1cdbd2cSJim Jagielski OSL_ENSURE( getFlag( nFlags, BIFF_CFRULE_BORDERBLOCK ), "Border::importCfRule - missing border block flag" );
1727*b1cdbd2cSJim Jagielski sal_uInt16 nStyle;
1728*b1cdbd2cSJim Jagielski sal_uInt32 nColor;
1729*b1cdbd2cSJim Jagielski rStrm >> nStyle >> nColor;
1730*b1cdbd2cSJim Jagielski rStrm.skip( 2 );
1731*b1cdbd2cSJim Jagielski maModel.maLeft.setBiffData( extractValue< sal_uInt8 >( nStyle, 0, 4 ), extractValue< sal_uInt16 >( nColor, 0, 7 ) );
1732*b1cdbd2cSJim Jagielski maModel.maRight.setBiffData( extractValue< sal_uInt8 >( nStyle, 4, 4 ), extractValue< sal_uInt16 >( nColor, 7, 7 ) );
1733*b1cdbd2cSJim Jagielski maModel.maTop.setBiffData( extractValue< sal_uInt8 >( nStyle, 8, 4 ), extractValue< sal_uInt16 >( nColor, 16, 7 ) );
1734*b1cdbd2cSJim Jagielski maModel.maBottom.setBiffData( extractValue< sal_uInt8 >( nStyle, 12, 4 ), extractValue< sal_uInt16 >( nColor, 23, 7 ) );
1735*b1cdbd2cSJim Jagielski maModel.maLeft.mbUsed = !getFlag( nFlags, BIFF_CFRULE_BORDER_LEFT );
1736*b1cdbd2cSJim Jagielski maModel.maRight.mbUsed = !getFlag( nFlags, BIFF_CFRULE_BORDER_RIGHT );
1737*b1cdbd2cSJim Jagielski maModel.maTop.mbUsed = !getFlag( nFlags, BIFF_CFRULE_BORDER_TOP );
1738*b1cdbd2cSJim Jagielski maModel.maBottom.mbUsed = !getFlag( nFlags, BIFF_CFRULE_BORDER_BOTTOM );
1739*b1cdbd2cSJim Jagielski }
1740*b1cdbd2cSJim Jagielski
finalizeImport()1741*b1cdbd2cSJim Jagielski void Border::finalizeImport()
1742*b1cdbd2cSJim Jagielski {
1743*b1cdbd2cSJim Jagielski maApiData.mbBorderUsed = maModel.maLeft.mbUsed || maModel.maRight.mbUsed || maModel.maTop.mbUsed || maModel.maBottom.mbUsed;
1744*b1cdbd2cSJim Jagielski maApiData.mbDiagUsed = maModel.maDiagonal.mbUsed;
1745*b1cdbd2cSJim Jagielski
1746*b1cdbd2cSJim Jagielski maApiData.maBorder.IsLeftLineValid = convertBorderLine( maApiData.maBorder.LeftLine, maModel.maLeft );
1747*b1cdbd2cSJim Jagielski maApiData.maBorder.IsRightLineValid = convertBorderLine( maApiData.maBorder.RightLine, maModel.maRight );
1748*b1cdbd2cSJim Jagielski maApiData.maBorder.IsTopLineValid = convertBorderLine( maApiData.maBorder.TopLine, maModel.maTop );
1749*b1cdbd2cSJim Jagielski maApiData.maBorder.IsBottomLineValid = convertBorderLine( maApiData.maBorder.BottomLine, maModel.maBottom );
1750*b1cdbd2cSJim Jagielski
1751*b1cdbd2cSJim Jagielski if( !mbDxf )
1752*b1cdbd2cSJim Jagielski {
1753*b1cdbd2cSJim Jagielski maApiData.maBorder.IsVerticalLineValid = maApiData.maBorder.IsLeftLineValid || maApiData.maBorder.IsRightLineValid;
1754*b1cdbd2cSJim Jagielski if( const BorderLine* pVertLine = lclGetThickerLine( maApiData.maBorder.LeftLine, maApiData.maBorder.IsLeftLineValid, maApiData.maBorder.RightLine, maApiData.maBorder.IsRightLineValid ) )
1755*b1cdbd2cSJim Jagielski maApiData.maBorder.VerticalLine = *pVertLine;
1756*b1cdbd2cSJim Jagielski
1757*b1cdbd2cSJim Jagielski maApiData.maBorder.IsHorizontalLineValid = maApiData.maBorder.IsTopLineValid || maApiData.maBorder.IsBottomLineValid;
1758*b1cdbd2cSJim Jagielski if( const BorderLine* pHorLine = lclGetThickerLine( maApiData.maBorder.TopLine, maApiData.maBorder.IsTopLineValid, maApiData.maBorder.BottomLine, maApiData.maBorder.IsBottomLineValid ) )
1759*b1cdbd2cSJim Jagielski maApiData.maBorder.HorizontalLine = *pHorLine;
1760*b1cdbd2cSJim Jagielski }
1761*b1cdbd2cSJim Jagielski
1762*b1cdbd2cSJim Jagielski if( maModel.mbDiagTLtoBR )
1763*b1cdbd2cSJim Jagielski convertBorderLine( maApiData.maTLtoBR, maModel.maDiagonal );
1764*b1cdbd2cSJim Jagielski if( maModel.mbDiagBLtoTR )
1765*b1cdbd2cSJim Jagielski convertBorderLine( maApiData.maBLtoTR, maModel.maDiagonal );
1766*b1cdbd2cSJim Jagielski }
1767*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap) const1768*b1cdbd2cSJim Jagielski void Border::writeToPropertyMap( PropertyMap& rPropMap ) const
1769*b1cdbd2cSJim Jagielski {
1770*b1cdbd2cSJim Jagielski if( maApiData.mbBorderUsed )
1771*b1cdbd2cSJim Jagielski rPropMap[ PROP_TableBorder ] <<= maApiData.maBorder;
1772*b1cdbd2cSJim Jagielski if( maApiData.mbDiagUsed )
1773*b1cdbd2cSJim Jagielski {
1774*b1cdbd2cSJim Jagielski rPropMap[ PROP_DiagonalTLBR ] <<= maApiData.maTLtoBR;
1775*b1cdbd2cSJim Jagielski rPropMap[ PROP_DiagonalBLTR ] <<= maApiData.maBLtoTR;
1776*b1cdbd2cSJim Jagielski }
1777*b1cdbd2cSJim Jagielski }
1778*b1cdbd2cSJim Jagielski
getBorderLine(sal_Int32 nElement)1779*b1cdbd2cSJim Jagielski BorderLineModel* Border::getBorderLine( sal_Int32 nElement )
1780*b1cdbd2cSJim Jagielski {
1781*b1cdbd2cSJim Jagielski switch( nElement )
1782*b1cdbd2cSJim Jagielski {
1783*b1cdbd2cSJim Jagielski case XLS_TOKEN( left ): return &maModel.maLeft;
1784*b1cdbd2cSJim Jagielski case XLS_TOKEN( right ): return &maModel.maRight;
1785*b1cdbd2cSJim Jagielski case XLS_TOKEN( top ): return &maModel.maTop;
1786*b1cdbd2cSJim Jagielski case XLS_TOKEN( bottom ): return &maModel.maBottom;
1787*b1cdbd2cSJim Jagielski case XLS_TOKEN( diagonal ): return &maModel.maDiagonal;
1788*b1cdbd2cSJim Jagielski }
1789*b1cdbd2cSJim Jagielski return 0;
1790*b1cdbd2cSJim Jagielski }
1791*b1cdbd2cSJim Jagielski
convertBorderLine(BorderLine & rBorderLine,const BorderLineModel & rModel)1792*b1cdbd2cSJim Jagielski bool Border::convertBorderLine( BorderLine& rBorderLine, const BorderLineModel& rModel )
1793*b1cdbd2cSJim Jagielski {
1794*b1cdbd2cSJim Jagielski rBorderLine.Color = rModel.maColor.getColor( getBaseFilter().getGraphicHelper(), API_RGB_BLACK );
1795*b1cdbd2cSJim Jagielski switch( rModel.mnStyle )
1796*b1cdbd2cSJim Jagielski {
1797*b1cdbd2cSJim Jagielski case XML_dashDot: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN ); break;
1798*b1cdbd2cSJim Jagielski case XML_dashDotDot: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN ); break;
1799*b1cdbd2cSJim Jagielski case XML_dashed: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN ); break;
1800*b1cdbd2cSJim Jagielski case XML_dotted: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN ); break;
1801*b1cdbd2cSJim Jagielski case XML_double: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN, API_LINE_THIN, API_LINE_THIN ); break;
1802*b1cdbd2cSJim Jagielski case XML_hair: lclSetBorderLineWidth( rBorderLine, API_LINE_HAIR ); break;
1803*b1cdbd2cSJim Jagielski case XML_medium: lclSetBorderLineWidth( rBorderLine, API_LINE_MEDIUM ); break;
1804*b1cdbd2cSJim Jagielski case XML_mediumDashDot: lclSetBorderLineWidth( rBorderLine, API_LINE_MEDIUM ); break;
1805*b1cdbd2cSJim Jagielski case XML_mediumDashDotDot: lclSetBorderLineWidth( rBorderLine, API_LINE_MEDIUM ); break;
1806*b1cdbd2cSJim Jagielski case XML_mediumDashed: lclSetBorderLineWidth( rBorderLine, API_LINE_MEDIUM ); break;
1807*b1cdbd2cSJim Jagielski case XML_none: lclSetBorderLineWidth( rBorderLine, API_LINE_NONE ); break;
1808*b1cdbd2cSJim Jagielski case XML_slantDashDot: lclSetBorderLineWidth( rBorderLine, API_LINE_MEDIUM ); break;
1809*b1cdbd2cSJim Jagielski case XML_thick: lclSetBorderLineWidth( rBorderLine, API_LINE_THICK ); break;
1810*b1cdbd2cSJim Jagielski case XML_thin: lclSetBorderLineWidth( rBorderLine, API_LINE_THIN ); break;
1811*b1cdbd2cSJim Jagielski default: lclSetBorderLineWidth( rBorderLine, API_LINE_NONE ); break;
1812*b1cdbd2cSJim Jagielski }
1813*b1cdbd2cSJim Jagielski return rModel.mbUsed;
1814*b1cdbd2cSJim Jagielski }
1815*b1cdbd2cSJim Jagielski
1816*b1cdbd2cSJim Jagielski
1817*b1cdbd2cSJim Jagielski // ============================================================================
1818*b1cdbd2cSJim Jagielski
PatternFillModel(bool bDxf)1819*b1cdbd2cSJim Jagielski PatternFillModel::PatternFillModel( bool bDxf ) :
1820*b1cdbd2cSJim Jagielski mnPattern( XML_none ),
1821*b1cdbd2cSJim Jagielski mbPattColorUsed( !bDxf ),
1822*b1cdbd2cSJim Jagielski mbFillColorUsed( !bDxf ),
1823*b1cdbd2cSJim Jagielski mbPatternUsed( !bDxf )
1824*b1cdbd2cSJim Jagielski {
1825*b1cdbd2cSJim Jagielski maPatternColor.setIndexed( OOX_COLOR_WINDOWTEXT );
1826*b1cdbd2cSJim Jagielski maFillColor.setIndexed( OOX_COLOR_WINDOWBACK );
1827*b1cdbd2cSJim Jagielski }
1828*b1cdbd2cSJim Jagielski
setBiffPattern(sal_Int32 nPattern)1829*b1cdbd2cSJim Jagielski void PatternFillModel::setBiffPattern( sal_Int32 nPattern )
1830*b1cdbd2cSJim Jagielski {
1831*b1cdbd2cSJim Jagielski static const sal_Int32 spnPatternIds[] = {
1832*b1cdbd2cSJim Jagielski XML_none, XML_solid, XML_mediumGray, XML_darkGray,
1833*b1cdbd2cSJim Jagielski XML_lightGray, XML_darkHorizontal, XML_darkVertical, XML_darkDown,
1834*b1cdbd2cSJim Jagielski XML_darkUp, XML_darkGrid, XML_darkTrellis, XML_lightHorizontal,
1835*b1cdbd2cSJim Jagielski XML_lightVertical, XML_lightDown, XML_lightUp, XML_lightGrid,
1836*b1cdbd2cSJim Jagielski XML_lightTrellis, XML_gray125, XML_gray0625 };
1837*b1cdbd2cSJim Jagielski mnPattern = STATIC_ARRAY_SELECT( spnPatternIds, nPattern, XML_none );
1838*b1cdbd2cSJim Jagielski }
1839*b1cdbd2cSJim Jagielski
setBiffData(sal_uInt16 nPatternColor,sal_uInt16 nFillColor,sal_uInt8 nPattern)1840*b1cdbd2cSJim Jagielski void PatternFillModel::setBiffData( sal_uInt16 nPatternColor, sal_uInt16 nFillColor, sal_uInt8 nPattern )
1841*b1cdbd2cSJim Jagielski {
1842*b1cdbd2cSJim Jagielski maPatternColor.setIndexed( nPatternColor );
1843*b1cdbd2cSJim Jagielski maFillColor.setIndexed( nFillColor );
1844*b1cdbd2cSJim Jagielski // patterns equal in all BIFFs
1845*b1cdbd2cSJim Jagielski setBiffPattern( nPattern );
1846*b1cdbd2cSJim Jagielski }
1847*b1cdbd2cSJim Jagielski
1848*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1849*b1cdbd2cSJim Jagielski
GradientFillModel()1850*b1cdbd2cSJim Jagielski GradientFillModel::GradientFillModel() :
1851*b1cdbd2cSJim Jagielski mnType( XML_linear ),
1852*b1cdbd2cSJim Jagielski mfAngle( 0.0 ),
1853*b1cdbd2cSJim Jagielski mfLeft( 0.0 ),
1854*b1cdbd2cSJim Jagielski mfRight( 0.0 ),
1855*b1cdbd2cSJim Jagielski mfTop( 0.0 ),
1856*b1cdbd2cSJim Jagielski mfBottom( 0.0 )
1857*b1cdbd2cSJim Jagielski {
1858*b1cdbd2cSJim Jagielski }
1859*b1cdbd2cSJim Jagielski
readGradient(SequenceInputStream & rStrm)1860*b1cdbd2cSJim Jagielski void GradientFillModel::readGradient( SequenceInputStream& rStrm )
1861*b1cdbd2cSJim Jagielski {
1862*b1cdbd2cSJim Jagielski sal_Int32 nType;
1863*b1cdbd2cSJim Jagielski rStrm >> nType >> mfAngle >> mfLeft >> mfRight >> mfTop >> mfBottom;
1864*b1cdbd2cSJim Jagielski static const sal_Int32 spnTypes[] = { XML_linear, XML_path };
1865*b1cdbd2cSJim Jagielski mnType = STATIC_ARRAY_SELECT( spnTypes, nType, XML_TOKEN_INVALID );
1866*b1cdbd2cSJim Jagielski }
1867*b1cdbd2cSJim Jagielski
readGradientStop(SequenceInputStream & rStrm,bool bDxf)1868*b1cdbd2cSJim Jagielski void GradientFillModel::readGradientStop( SequenceInputStream& rStrm, bool bDxf )
1869*b1cdbd2cSJim Jagielski {
1870*b1cdbd2cSJim Jagielski Color aColor;
1871*b1cdbd2cSJim Jagielski double fPosition;
1872*b1cdbd2cSJim Jagielski if( bDxf )
1873*b1cdbd2cSJim Jagielski {
1874*b1cdbd2cSJim Jagielski rStrm.skip( 2 );
1875*b1cdbd2cSJim Jagielski rStrm >> fPosition >> aColor;
1876*b1cdbd2cSJim Jagielski }
1877*b1cdbd2cSJim Jagielski else
1878*b1cdbd2cSJim Jagielski {
1879*b1cdbd2cSJim Jagielski rStrm >> aColor >> fPosition;
1880*b1cdbd2cSJim Jagielski }
1881*b1cdbd2cSJim Jagielski if( !rStrm.isEof() && (fPosition >= 0.0) )
1882*b1cdbd2cSJim Jagielski maColors[ fPosition ] = aColor;
1883*b1cdbd2cSJim Jagielski }
1884*b1cdbd2cSJim Jagielski
1885*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1886*b1cdbd2cSJim Jagielski
ApiSolidFillData()1887*b1cdbd2cSJim Jagielski ApiSolidFillData::ApiSolidFillData() :
1888*b1cdbd2cSJim Jagielski mnColor( API_RGB_TRANSPARENT ),
1889*b1cdbd2cSJim Jagielski mbTransparent( true ),
1890*b1cdbd2cSJim Jagielski mbUsed( false )
1891*b1cdbd2cSJim Jagielski {
1892*b1cdbd2cSJim Jagielski }
1893*b1cdbd2cSJim Jagielski
operator ==(const ApiSolidFillData & rLeft,const ApiSolidFillData & rRight)1894*b1cdbd2cSJim Jagielski bool operator==( const ApiSolidFillData& rLeft, const ApiSolidFillData& rRight )
1895*b1cdbd2cSJim Jagielski {
1896*b1cdbd2cSJim Jagielski return
1897*b1cdbd2cSJim Jagielski (rLeft.mnColor == rRight.mnColor) &&
1898*b1cdbd2cSJim Jagielski (rLeft.mbTransparent == rRight.mbTransparent) &&
1899*b1cdbd2cSJim Jagielski (rLeft.mbUsed == rRight.mbUsed);
1900*b1cdbd2cSJim Jagielski }
1901*b1cdbd2cSJim Jagielski
1902*b1cdbd2cSJim Jagielski // ============================================================================
1903*b1cdbd2cSJim Jagielski
1904*b1cdbd2cSJim Jagielski namespace {
1905*b1cdbd2cSJim Jagielski
lclGetMixedColorComp(sal_Int32 nPatt,sal_Int32 nFill,sal_Int32 nAlpha)1906*b1cdbd2cSJim Jagielski inline sal_Int32 lclGetMixedColorComp( sal_Int32 nPatt, sal_Int32 nFill, sal_Int32 nAlpha )
1907*b1cdbd2cSJim Jagielski {
1908*b1cdbd2cSJim Jagielski return ((nPatt - nFill) * nAlpha) / 0x80 + nFill;
1909*b1cdbd2cSJim Jagielski }
1910*b1cdbd2cSJim Jagielski
lclGetMixedColor(sal_Int32 nPattColor,sal_Int32 nFillColor,sal_Int32 nAlpha)1911*b1cdbd2cSJim Jagielski sal_Int32 lclGetMixedColor( sal_Int32 nPattColor, sal_Int32 nFillColor, sal_Int32 nAlpha )
1912*b1cdbd2cSJim Jagielski {
1913*b1cdbd2cSJim Jagielski return
1914*b1cdbd2cSJim Jagielski (lclGetMixedColorComp( nPattColor & 0xFF0000, nFillColor & 0xFF0000, nAlpha ) & 0xFF0000) |
1915*b1cdbd2cSJim Jagielski (lclGetMixedColorComp( nPattColor & 0x00FF00, nFillColor & 0x00FF00, nAlpha ) & 0x00FF00) |
1916*b1cdbd2cSJim Jagielski (lclGetMixedColorComp( nPattColor & 0x0000FF, nFillColor & 0x0000FF, nAlpha ) & 0x0000FF);
1917*b1cdbd2cSJim Jagielski }
1918*b1cdbd2cSJim Jagielski
1919*b1cdbd2cSJim Jagielski } // namespace
1920*b1cdbd2cSJim Jagielski
1921*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
1922*b1cdbd2cSJim Jagielski
Fill(const WorkbookHelper & rHelper,bool bDxf)1923*b1cdbd2cSJim Jagielski Fill::Fill( const WorkbookHelper& rHelper, bool bDxf ) :
1924*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
1925*b1cdbd2cSJim Jagielski mbDxf( bDxf )
1926*b1cdbd2cSJim Jagielski {
1927*b1cdbd2cSJim Jagielski }
1928*b1cdbd2cSJim Jagielski
importPatternFill(const AttributeList & rAttribs)1929*b1cdbd2cSJim Jagielski void Fill::importPatternFill( const AttributeList& rAttribs )
1930*b1cdbd2cSJim Jagielski {
1931*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
1932*b1cdbd2cSJim Jagielski mxPatternModel->mnPattern = rAttribs.getToken( XML_patternType, XML_none );
1933*b1cdbd2cSJim Jagielski if( mbDxf )
1934*b1cdbd2cSJim Jagielski mxPatternModel->mbPatternUsed = rAttribs.hasAttribute( XML_patternType );
1935*b1cdbd2cSJim Jagielski }
1936*b1cdbd2cSJim Jagielski
importFgColor(const AttributeList & rAttribs)1937*b1cdbd2cSJim Jagielski void Fill::importFgColor( const AttributeList& rAttribs )
1938*b1cdbd2cSJim Jagielski {
1939*b1cdbd2cSJim Jagielski OSL_ENSURE( mxPatternModel.get(), "Fill::importFgColor - missing pattern data" );
1940*b1cdbd2cSJim Jagielski if( mxPatternModel.get() )
1941*b1cdbd2cSJim Jagielski {
1942*b1cdbd2cSJim Jagielski mxPatternModel->maPatternColor.importColor( rAttribs );
1943*b1cdbd2cSJim Jagielski mxPatternModel->mbPattColorUsed = true;
1944*b1cdbd2cSJim Jagielski }
1945*b1cdbd2cSJim Jagielski }
1946*b1cdbd2cSJim Jagielski
importBgColor(const AttributeList & rAttribs)1947*b1cdbd2cSJim Jagielski void Fill::importBgColor( const AttributeList& rAttribs )
1948*b1cdbd2cSJim Jagielski {
1949*b1cdbd2cSJim Jagielski OSL_ENSURE( mxPatternModel.get(), "Fill::importBgColor - missing pattern data" );
1950*b1cdbd2cSJim Jagielski if( mxPatternModel.get() )
1951*b1cdbd2cSJim Jagielski {
1952*b1cdbd2cSJim Jagielski mxPatternModel->maFillColor.importColor( rAttribs );
1953*b1cdbd2cSJim Jagielski mxPatternModel->mbFillColorUsed = true;
1954*b1cdbd2cSJim Jagielski }
1955*b1cdbd2cSJim Jagielski }
1956*b1cdbd2cSJim Jagielski
importGradientFill(const AttributeList & rAttribs)1957*b1cdbd2cSJim Jagielski void Fill::importGradientFill( const AttributeList& rAttribs )
1958*b1cdbd2cSJim Jagielski {
1959*b1cdbd2cSJim Jagielski mxGradientModel.reset( new GradientFillModel );
1960*b1cdbd2cSJim Jagielski mxGradientModel->mnType = rAttribs.getToken( XML_type, XML_linear );
1961*b1cdbd2cSJim Jagielski mxGradientModel->mfAngle = rAttribs.getDouble( XML_degree, 0.0 );
1962*b1cdbd2cSJim Jagielski mxGradientModel->mfLeft = rAttribs.getDouble( XML_left, 0.0 );
1963*b1cdbd2cSJim Jagielski mxGradientModel->mfRight = rAttribs.getDouble( XML_right, 0.0 );
1964*b1cdbd2cSJim Jagielski mxGradientModel->mfTop = rAttribs.getDouble( XML_top, 0.0 );
1965*b1cdbd2cSJim Jagielski mxGradientModel->mfBottom = rAttribs.getDouble( XML_bottom, 0.0 );
1966*b1cdbd2cSJim Jagielski }
1967*b1cdbd2cSJim Jagielski
importColor(const AttributeList & rAttribs,double fPosition)1968*b1cdbd2cSJim Jagielski void Fill::importColor( const AttributeList& rAttribs, double fPosition )
1969*b1cdbd2cSJim Jagielski {
1970*b1cdbd2cSJim Jagielski OSL_ENSURE( mxGradientModel.get(), "Fill::importColor - missing gradient data" );
1971*b1cdbd2cSJim Jagielski if( mxGradientModel.get() && (fPosition >= 0.0) )
1972*b1cdbd2cSJim Jagielski mxGradientModel->maColors[ fPosition ].importColor( rAttribs );
1973*b1cdbd2cSJim Jagielski }
1974*b1cdbd2cSJim Jagielski
importFill(SequenceInputStream & rStrm)1975*b1cdbd2cSJim Jagielski void Fill::importFill( SequenceInputStream& rStrm )
1976*b1cdbd2cSJim Jagielski {
1977*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Fill::importFill - unexpected conditional formatting flag" );
1978*b1cdbd2cSJim Jagielski sal_Int32 nPattern = rStrm.readInt32();
1979*b1cdbd2cSJim Jagielski if( nPattern == BIFF12_FILL_GRADIENT )
1980*b1cdbd2cSJim Jagielski {
1981*b1cdbd2cSJim Jagielski mxGradientModel.reset( new GradientFillModel );
1982*b1cdbd2cSJim Jagielski sal_Int32 nStopCount;
1983*b1cdbd2cSJim Jagielski rStrm.skip( 16 );
1984*b1cdbd2cSJim Jagielski mxGradientModel->readGradient( rStrm );
1985*b1cdbd2cSJim Jagielski rStrm >> nStopCount;
1986*b1cdbd2cSJim Jagielski for( sal_Int32 nStop = 0; (nStop < nStopCount) && !rStrm.isEof(); ++nStop )
1987*b1cdbd2cSJim Jagielski mxGradientModel->readGradientStop( rStrm, false );
1988*b1cdbd2cSJim Jagielski }
1989*b1cdbd2cSJim Jagielski else
1990*b1cdbd2cSJim Jagielski {
1991*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
1992*b1cdbd2cSJim Jagielski mxPatternModel->setBiffPattern( nPattern );
1993*b1cdbd2cSJim Jagielski rStrm >> mxPatternModel->maPatternColor >> mxPatternModel->maFillColor;
1994*b1cdbd2cSJim Jagielski }
1995*b1cdbd2cSJim Jagielski }
1996*b1cdbd2cSJim Jagielski
importDxfPattern(SequenceInputStream & rStrm)1997*b1cdbd2cSJim Jagielski void Fill::importDxfPattern( SequenceInputStream& rStrm )
1998*b1cdbd2cSJim Jagielski {
1999*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Fill::importDxfPattern - missing conditional formatting flag" );
2000*b1cdbd2cSJim Jagielski if( !mxPatternModel )
2001*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2002*b1cdbd2cSJim Jagielski mxPatternModel->setBiffPattern( rStrm.readuInt8() );
2003*b1cdbd2cSJim Jagielski mxPatternModel->mbPatternUsed = true;
2004*b1cdbd2cSJim Jagielski }
2005*b1cdbd2cSJim Jagielski
importDxfFgColor(SequenceInputStream & rStrm)2006*b1cdbd2cSJim Jagielski void Fill::importDxfFgColor( SequenceInputStream& rStrm )
2007*b1cdbd2cSJim Jagielski {
2008*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Fill::importDxfFgColor - missing conditional formatting flag" );
2009*b1cdbd2cSJim Jagielski if( !mxPatternModel )
2010*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2011*b1cdbd2cSJim Jagielski mxPatternModel->maPatternColor.importColor( rStrm );
2012*b1cdbd2cSJim Jagielski mxPatternModel->mbPattColorUsed = true;
2013*b1cdbd2cSJim Jagielski }
2014*b1cdbd2cSJim Jagielski
importDxfBgColor(SequenceInputStream & rStrm)2015*b1cdbd2cSJim Jagielski void Fill::importDxfBgColor( SequenceInputStream& rStrm )
2016*b1cdbd2cSJim Jagielski {
2017*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Fill::importDxfBgColor - missing conditional formatting flag" );
2018*b1cdbd2cSJim Jagielski if( !mxPatternModel )
2019*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2020*b1cdbd2cSJim Jagielski mxPatternModel->maFillColor.importColor( rStrm );
2021*b1cdbd2cSJim Jagielski mxPatternModel->mbFillColorUsed = true;
2022*b1cdbd2cSJim Jagielski }
2023*b1cdbd2cSJim Jagielski
importDxfGradient(SequenceInputStream & rStrm)2024*b1cdbd2cSJim Jagielski void Fill::importDxfGradient( SequenceInputStream& rStrm )
2025*b1cdbd2cSJim Jagielski {
2026*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Fill::importDxfGradient - missing conditional formatting flag" );
2027*b1cdbd2cSJim Jagielski if( !mxGradientModel )
2028*b1cdbd2cSJim Jagielski mxGradientModel.reset( new GradientFillModel );
2029*b1cdbd2cSJim Jagielski mxGradientModel->readGradient( rStrm );
2030*b1cdbd2cSJim Jagielski }
2031*b1cdbd2cSJim Jagielski
importDxfStop(SequenceInputStream & rStrm)2032*b1cdbd2cSJim Jagielski void Fill::importDxfStop( SequenceInputStream& rStrm )
2033*b1cdbd2cSJim Jagielski {
2034*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Fill::importDxfStop - missing conditional formatting flag" );
2035*b1cdbd2cSJim Jagielski if( !mxGradientModel )
2036*b1cdbd2cSJim Jagielski mxGradientModel.reset( new GradientFillModel );
2037*b1cdbd2cSJim Jagielski mxGradientModel->readGradientStop( rStrm, true );
2038*b1cdbd2cSJim Jagielski }
2039*b1cdbd2cSJim Jagielski
setBiff2Data(sal_uInt8 nFlags)2040*b1cdbd2cSJim Jagielski void Fill::setBiff2Data( sal_uInt8 nFlags )
2041*b1cdbd2cSJim Jagielski {
2042*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Fill::setBiff2Data - unexpected conditional formatting flag" );
2043*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2044*b1cdbd2cSJim Jagielski mxPatternModel->setBiffData(
2045*b1cdbd2cSJim Jagielski BIFF2_COLOR_BLACK,
2046*b1cdbd2cSJim Jagielski BIFF2_COLOR_WHITE,
2047*b1cdbd2cSJim Jagielski getFlagValue( nFlags, BIFF2_XF_BACKGROUND, BIFF_PATT_125, BIFF_PATT_NONE ) );
2048*b1cdbd2cSJim Jagielski }
2049*b1cdbd2cSJim Jagielski
setBiff3Data(sal_uInt16 nArea)2050*b1cdbd2cSJim Jagielski void Fill::setBiff3Data( sal_uInt16 nArea )
2051*b1cdbd2cSJim Jagielski {
2052*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Fill::setBiff3Data - unexpected conditional formatting flag" );
2053*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2054*b1cdbd2cSJim Jagielski mxPatternModel->setBiffData(
2055*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nArea, 6, 5 ),
2056*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nArea, 11, 5 ),
2057*b1cdbd2cSJim Jagielski extractValue< sal_uInt8 >( nArea, 0, 6 ) );
2058*b1cdbd2cSJim Jagielski }
2059*b1cdbd2cSJim Jagielski
setBiff5Data(sal_uInt32 nArea)2060*b1cdbd2cSJim Jagielski void Fill::setBiff5Data( sal_uInt32 nArea )
2061*b1cdbd2cSJim Jagielski {
2062*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Fill::setBiff5Data - unexpected conditional formatting flag" );
2063*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2064*b1cdbd2cSJim Jagielski mxPatternModel->setBiffData(
2065*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nArea, 0, 7 ),
2066*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nArea, 7, 7 ),
2067*b1cdbd2cSJim Jagielski extractValue< sal_uInt8 >( nArea, 16, 6 ) );
2068*b1cdbd2cSJim Jagielski }
2069*b1cdbd2cSJim Jagielski
setBiff8Data(sal_uInt32 nBorder2,sal_uInt16 nArea)2070*b1cdbd2cSJim Jagielski void Fill::setBiff8Data( sal_uInt32 nBorder2, sal_uInt16 nArea )
2071*b1cdbd2cSJim Jagielski {
2072*b1cdbd2cSJim Jagielski OSL_ENSURE( !mbDxf, "Fill::setBiff8Data - unexpected conditional formatting flag" );
2073*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2074*b1cdbd2cSJim Jagielski mxPatternModel->setBiffData(
2075*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nArea, 0, 7 ),
2076*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nArea, 7, 7 ),
2077*b1cdbd2cSJim Jagielski extractValue< sal_uInt8 >( nBorder2, 26, 6 ) );
2078*b1cdbd2cSJim Jagielski }
2079*b1cdbd2cSJim Jagielski
importCfRule(BiffInputStream & rStrm,sal_uInt32 nFlags)2080*b1cdbd2cSJim Jagielski void Fill::importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags )
2081*b1cdbd2cSJim Jagielski {
2082*b1cdbd2cSJim Jagielski OSL_ENSURE( mbDxf, "Fill::importCfRule - missing conditional formatting flag" );
2083*b1cdbd2cSJim Jagielski OSL_ENSURE( getFlag( nFlags, BIFF_CFRULE_FILLBLOCK ), "Fill::importCfRule - missing fill block flag" );
2084*b1cdbd2cSJim Jagielski mxPatternModel.reset( new PatternFillModel( mbDxf ) );
2085*b1cdbd2cSJim Jagielski sal_uInt32 nFillData;
2086*b1cdbd2cSJim Jagielski rStrm >> nFillData;
2087*b1cdbd2cSJim Jagielski mxPatternModel->setBiffData(
2088*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nFillData, 16, 7 ),
2089*b1cdbd2cSJim Jagielski extractValue< sal_uInt16 >( nFillData, 23, 7 ),
2090*b1cdbd2cSJim Jagielski extractValue< sal_uInt8 >( nFillData, 10, 6 ) );
2091*b1cdbd2cSJim Jagielski mxPatternModel->mbPattColorUsed = !getFlag( nFlags, BIFF_CFRULE_FILL_PATTCOLOR );
2092*b1cdbd2cSJim Jagielski mxPatternModel->mbFillColorUsed = !getFlag( nFlags, BIFF_CFRULE_FILL_FILLCOLOR );
2093*b1cdbd2cSJim Jagielski mxPatternModel->mbPatternUsed = !getFlag( nFlags, BIFF_CFRULE_FILL_PATTERN );
2094*b1cdbd2cSJim Jagielski }
2095*b1cdbd2cSJim Jagielski
finalizeImport()2096*b1cdbd2cSJim Jagielski void Fill::finalizeImport()
2097*b1cdbd2cSJim Jagielski {
2098*b1cdbd2cSJim Jagielski const GraphicHelper& rGraphicHelper = getBaseFilter().getGraphicHelper();
2099*b1cdbd2cSJim Jagielski
2100*b1cdbd2cSJim Jagielski if( mxPatternModel.get() )
2101*b1cdbd2cSJim Jagielski {
2102*b1cdbd2cSJim Jagielski // finalize the OOXML data struct
2103*b1cdbd2cSJim Jagielski PatternFillModel& rModel = *mxPatternModel;
2104*b1cdbd2cSJim Jagielski if( mbDxf )
2105*b1cdbd2cSJim Jagielski {
2106*b1cdbd2cSJim Jagielski if( rModel.mbFillColorUsed && (!rModel.mbPatternUsed || (rModel.mnPattern == XML_solid)) )
2107*b1cdbd2cSJim Jagielski {
2108*b1cdbd2cSJim Jagielski rModel.maPatternColor = rModel.maFillColor;
2109*b1cdbd2cSJim Jagielski rModel.mnPattern = XML_solid;
2110*b1cdbd2cSJim Jagielski rModel.mbPattColorUsed = rModel.mbPatternUsed = true;
2111*b1cdbd2cSJim Jagielski }
2112*b1cdbd2cSJim Jagielski else if( !rModel.mbFillColorUsed && rModel.mbPatternUsed && (rModel.mnPattern == XML_solid) )
2113*b1cdbd2cSJim Jagielski {
2114*b1cdbd2cSJim Jagielski rModel.mbPatternUsed = false;
2115*b1cdbd2cSJim Jagielski }
2116*b1cdbd2cSJim Jagielski }
2117*b1cdbd2cSJim Jagielski
2118*b1cdbd2cSJim Jagielski // convert to API fill settings
2119*b1cdbd2cSJim Jagielski maApiData.mbUsed = rModel.mbPatternUsed;
2120*b1cdbd2cSJim Jagielski if( rModel.mnPattern == XML_none )
2121*b1cdbd2cSJim Jagielski {
2122*b1cdbd2cSJim Jagielski maApiData.mnColor = API_RGB_TRANSPARENT;
2123*b1cdbd2cSJim Jagielski maApiData.mbTransparent = true;
2124*b1cdbd2cSJim Jagielski }
2125*b1cdbd2cSJim Jagielski else
2126*b1cdbd2cSJim Jagielski {
2127*b1cdbd2cSJim Jagielski sal_Int32 nAlpha = 0x80;
2128*b1cdbd2cSJim Jagielski switch( rModel.mnPattern )
2129*b1cdbd2cSJim Jagielski {
2130*b1cdbd2cSJim Jagielski case XML_darkDown: nAlpha = 0x40; break;
2131*b1cdbd2cSJim Jagielski case XML_darkGray: nAlpha = 0x60; break;
2132*b1cdbd2cSJim Jagielski case XML_darkGrid: nAlpha = 0x40; break;
2133*b1cdbd2cSJim Jagielski case XML_darkHorizontal: nAlpha = 0x40; break;
2134*b1cdbd2cSJim Jagielski case XML_darkTrellis: nAlpha = 0x60; break;
2135*b1cdbd2cSJim Jagielski case XML_darkUp: nAlpha = 0x40; break;
2136*b1cdbd2cSJim Jagielski case XML_darkVertical: nAlpha = 0x40; break;
2137*b1cdbd2cSJim Jagielski case XML_gray0625: nAlpha = 0x08; break;
2138*b1cdbd2cSJim Jagielski case XML_gray125: nAlpha = 0x10; break;
2139*b1cdbd2cSJim Jagielski case XML_lightDown: nAlpha = 0x20; break;
2140*b1cdbd2cSJim Jagielski case XML_lightGray: nAlpha = 0x20; break;
2141*b1cdbd2cSJim Jagielski case XML_lightGrid: nAlpha = 0x38; break;
2142*b1cdbd2cSJim Jagielski case XML_lightHorizontal: nAlpha = 0x20; break;
2143*b1cdbd2cSJim Jagielski case XML_lightTrellis: nAlpha = 0x30; break;
2144*b1cdbd2cSJim Jagielski case XML_lightUp: nAlpha = 0x20; break;
2145*b1cdbd2cSJim Jagielski case XML_lightVertical: nAlpha = 0x20; break;
2146*b1cdbd2cSJim Jagielski case XML_mediumGray: nAlpha = 0x40; break;
2147*b1cdbd2cSJim Jagielski case XML_solid: nAlpha = 0x80; break;
2148*b1cdbd2cSJim Jagielski }
2149*b1cdbd2cSJim Jagielski
2150*b1cdbd2cSJim Jagielski sal_Int32 nWinTextColor = rGraphicHelper.getSystemColor( XML_windowText );
2151*b1cdbd2cSJim Jagielski sal_Int32 nWinColor = rGraphicHelper.getSystemColor( XML_window );
2152*b1cdbd2cSJim Jagielski
2153*b1cdbd2cSJim Jagielski if( !rModel.mbPattColorUsed )
2154*b1cdbd2cSJim Jagielski rModel.maPatternColor.setAuto();
2155*b1cdbd2cSJim Jagielski sal_Int32 nPattColor = rModel.maPatternColor.getColor( rGraphicHelper, nWinTextColor );
2156*b1cdbd2cSJim Jagielski
2157*b1cdbd2cSJim Jagielski if( !rModel.mbFillColorUsed )
2158*b1cdbd2cSJim Jagielski rModel.maFillColor.setAuto();
2159*b1cdbd2cSJim Jagielski sal_Int32 nFillColor = rModel.maFillColor.getColor( rGraphicHelper, nWinColor );
2160*b1cdbd2cSJim Jagielski
2161*b1cdbd2cSJim Jagielski maApiData.mnColor = lclGetMixedColor( nPattColor, nFillColor, nAlpha );
2162*b1cdbd2cSJim Jagielski maApiData.mbTransparent = false;
2163*b1cdbd2cSJim Jagielski }
2164*b1cdbd2cSJim Jagielski }
2165*b1cdbd2cSJim Jagielski else if( mxGradientModel.get() && !mxGradientModel->maColors.empty() )
2166*b1cdbd2cSJim Jagielski {
2167*b1cdbd2cSJim Jagielski GradientFillModel& rModel = *mxGradientModel;
2168*b1cdbd2cSJim Jagielski maApiData.mbUsed = true; // no support for differential attributes
2169*b1cdbd2cSJim Jagielski GradientFillModel::ColorMap::const_iterator aIt = rModel.maColors.begin();
2170*b1cdbd2cSJim Jagielski OSL_ENSURE( !aIt->second.isAuto(), "Fill::finalizeImport - automatic gradient color" );
2171*b1cdbd2cSJim Jagielski maApiData.mnColor = aIt->second.getColor( rGraphicHelper, API_RGB_WHITE );
2172*b1cdbd2cSJim Jagielski if( ++aIt != rModel.maColors.end() )
2173*b1cdbd2cSJim Jagielski {
2174*b1cdbd2cSJim Jagielski OSL_ENSURE( !aIt->second.isAuto(), "Fill::finalizeImport - automatic gradient color" );
2175*b1cdbd2cSJim Jagielski sal_Int32 nEndColor = aIt->second.getColor( rGraphicHelper, API_RGB_WHITE );
2176*b1cdbd2cSJim Jagielski maApiData.mnColor = lclGetMixedColor( maApiData.mnColor, nEndColor, 0x40 );
2177*b1cdbd2cSJim Jagielski maApiData.mbTransparent = false;
2178*b1cdbd2cSJim Jagielski }
2179*b1cdbd2cSJim Jagielski }
2180*b1cdbd2cSJim Jagielski }
2181*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap) const2182*b1cdbd2cSJim Jagielski void Fill::writeToPropertyMap( PropertyMap& rPropMap ) const
2183*b1cdbd2cSJim Jagielski {
2184*b1cdbd2cSJim Jagielski if( maApiData.mbUsed )
2185*b1cdbd2cSJim Jagielski {
2186*b1cdbd2cSJim Jagielski rPropMap[ PROP_CellBackColor ] <<= maApiData.mnColor;
2187*b1cdbd2cSJim Jagielski rPropMap[ PROP_IsCellBackgroundTransparent ] <<= maApiData.mbTransparent;
2188*b1cdbd2cSJim Jagielski }
2189*b1cdbd2cSJim Jagielski }
2190*b1cdbd2cSJim Jagielski
2191*b1cdbd2cSJim Jagielski // ============================================================================
2192*b1cdbd2cSJim Jagielski
XfModel()2193*b1cdbd2cSJim Jagielski XfModel::XfModel() :
2194*b1cdbd2cSJim Jagielski mnStyleXfId( -1 ),
2195*b1cdbd2cSJim Jagielski mnFontId( -1 ),
2196*b1cdbd2cSJim Jagielski mnNumFmtId( -1 ),
2197*b1cdbd2cSJim Jagielski mnBorderId( -1 ),
2198*b1cdbd2cSJim Jagielski mnFillId( -1 ),
2199*b1cdbd2cSJim Jagielski mbCellXf( true ),
2200*b1cdbd2cSJim Jagielski mbFontUsed( false ),
2201*b1cdbd2cSJim Jagielski mbNumFmtUsed( false ),
2202*b1cdbd2cSJim Jagielski mbAlignUsed( false ),
2203*b1cdbd2cSJim Jagielski mbProtUsed( false ),
2204*b1cdbd2cSJim Jagielski mbBorderUsed( false ),
2205*b1cdbd2cSJim Jagielski mbAreaUsed( false )
2206*b1cdbd2cSJim Jagielski {
2207*b1cdbd2cSJim Jagielski }
2208*b1cdbd2cSJim Jagielski
2209*b1cdbd2cSJim Jagielski // ============================================================================
2210*b1cdbd2cSJim Jagielski
Xf(const WorkbookHelper & rHelper)2211*b1cdbd2cSJim Jagielski Xf::Xf( const WorkbookHelper& rHelper ) :
2212*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
2213*b1cdbd2cSJim Jagielski maAlignment( rHelper ),
2214*b1cdbd2cSJim Jagielski maProtection( rHelper ),
2215*b1cdbd2cSJim Jagielski meRotationRef( ::com::sun::star::table::CellVertJustify_STANDARD )
2216*b1cdbd2cSJim Jagielski {
2217*b1cdbd2cSJim Jagielski }
2218*b1cdbd2cSJim Jagielski
setAllUsedFlags(bool bUsed)2219*b1cdbd2cSJim Jagielski void Xf::setAllUsedFlags( bool bUsed )
2220*b1cdbd2cSJim Jagielski {
2221*b1cdbd2cSJim Jagielski maModel.mbAlignUsed = maModel.mbProtUsed = maModel.mbFontUsed =
2222*b1cdbd2cSJim Jagielski maModel.mbNumFmtUsed = maModel.mbBorderUsed = maModel.mbAreaUsed = bUsed;
2223*b1cdbd2cSJim Jagielski }
2224*b1cdbd2cSJim Jagielski
importXf(const AttributeList & rAttribs,bool bCellXf)2225*b1cdbd2cSJim Jagielski void Xf::importXf( const AttributeList& rAttribs, bool bCellXf )
2226*b1cdbd2cSJim Jagielski {
2227*b1cdbd2cSJim Jagielski maModel.mbCellXf = bCellXf;
2228*b1cdbd2cSJim Jagielski maModel.mnStyleXfId = rAttribs.getInteger( XML_xfId, -1 );
2229*b1cdbd2cSJim Jagielski maModel.mnFontId = rAttribs.getInteger( XML_fontId, -1 );
2230*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = rAttribs.getInteger( XML_numFmtId, -1 );
2231*b1cdbd2cSJim Jagielski maModel.mnBorderId = rAttribs.getInteger( XML_borderId, -1 );
2232*b1cdbd2cSJim Jagielski maModel.mnFillId = rAttribs.getInteger( XML_fillId, -1 );
2233*b1cdbd2cSJim Jagielski
2234*b1cdbd2cSJim Jagielski /* Default value of the apply*** attributes is dependent on context:
2235*b1cdbd2cSJim Jagielski true in cellStyleXfs element, false in cellXfs element... */
2236*b1cdbd2cSJim Jagielski maModel.mbAlignUsed = rAttribs.getBool( XML_applyAlignment, !maModel.mbCellXf );
2237*b1cdbd2cSJim Jagielski maModel.mbProtUsed = rAttribs.getBool( XML_applyProtection, !maModel.mbCellXf );
2238*b1cdbd2cSJim Jagielski maModel.mbFontUsed = rAttribs.getBool( XML_applyFont, !maModel.mbCellXf );
2239*b1cdbd2cSJim Jagielski maModel.mbNumFmtUsed = rAttribs.getBool( XML_applyNumberFormat, !maModel.mbCellXf );
2240*b1cdbd2cSJim Jagielski maModel.mbBorderUsed = rAttribs.getBool( XML_applyBorder, !maModel.mbCellXf );
2241*b1cdbd2cSJim Jagielski maModel.mbAreaUsed = rAttribs.getBool( XML_applyFill, !maModel.mbCellXf );
2242*b1cdbd2cSJim Jagielski }
2243*b1cdbd2cSJim Jagielski
importAlignment(const AttributeList & rAttribs)2244*b1cdbd2cSJim Jagielski void Xf::importAlignment( const AttributeList& rAttribs )
2245*b1cdbd2cSJim Jagielski {
2246*b1cdbd2cSJim Jagielski maAlignment.importAlignment( rAttribs );
2247*b1cdbd2cSJim Jagielski }
2248*b1cdbd2cSJim Jagielski
importProtection(const AttributeList & rAttribs)2249*b1cdbd2cSJim Jagielski void Xf::importProtection( const AttributeList& rAttribs )
2250*b1cdbd2cSJim Jagielski {
2251*b1cdbd2cSJim Jagielski maProtection.importProtection( rAttribs );
2252*b1cdbd2cSJim Jagielski }
2253*b1cdbd2cSJim Jagielski
importXf(SequenceInputStream & rStrm,bool bCellXf)2254*b1cdbd2cSJim Jagielski void Xf::importXf( SequenceInputStream& rStrm, bool bCellXf )
2255*b1cdbd2cSJim Jagielski {
2256*b1cdbd2cSJim Jagielski maModel.mbCellXf = bCellXf;
2257*b1cdbd2cSJim Jagielski maModel.mnStyleXfId = rStrm.readuInt16();
2258*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = rStrm.readuInt16();
2259*b1cdbd2cSJim Jagielski maModel.mnFontId = rStrm.readuInt16();
2260*b1cdbd2cSJim Jagielski maModel.mnFillId = rStrm.readuInt16();
2261*b1cdbd2cSJim Jagielski maModel.mnBorderId = rStrm.readuInt16();
2262*b1cdbd2cSJim Jagielski sal_uInt32 nFlags = rStrm.readuInt32();
2263*b1cdbd2cSJim Jagielski maAlignment.setBiff12Data( nFlags );
2264*b1cdbd2cSJim Jagielski maProtection.setBiff12Data( nFlags );
2265*b1cdbd2cSJim Jagielski // used flags, see comments in Xf::setBiffUsedFlags()
2266*b1cdbd2cSJim Jagielski sal_uInt16 nUsedFlags = rStrm.readuInt16();
2267*b1cdbd2cSJim Jagielski maModel.mbFontUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_FONT_USED );
2268*b1cdbd2cSJim Jagielski maModel.mbNumFmtUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_NUMFMT_USED );
2269*b1cdbd2cSJim Jagielski maModel.mbAlignUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_ALIGN_USED );
2270*b1cdbd2cSJim Jagielski maModel.mbProtUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_PROT_USED );
2271*b1cdbd2cSJim Jagielski maModel.mbBorderUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_BORDER_USED );
2272*b1cdbd2cSJim Jagielski maModel.mbAreaUsed = maModel.mbCellXf == getFlag( nUsedFlags, BIFF12_XF_AREA_USED );
2273*b1cdbd2cSJim Jagielski }
2274*b1cdbd2cSJim Jagielski
importXf(BiffInputStream & rStrm)2275*b1cdbd2cSJim Jagielski void Xf::importXf( BiffInputStream& rStrm )
2276*b1cdbd2cSJim Jagielski {
2277*b1cdbd2cSJim Jagielski BorderRef xBorder = getStyles().createBorder( &maModel.mnBorderId );
2278*b1cdbd2cSJim Jagielski FillRef xFill = getStyles().createFill( &maModel.mnFillId );
2279*b1cdbd2cSJim Jagielski
2280*b1cdbd2cSJim Jagielski switch( getBiff() )
2281*b1cdbd2cSJim Jagielski {
2282*b1cdbd2cSJim Jagielski case BIFF2:
2283*b1cdbd2cSJim Jagielski {
2284*b1cdbd2cSJim Jagielski sal_uInt8 nFontId, nNumFmtId, nFlags;
2285*b1cdbd2cSJim Jagielski rStrm >> nFontId;
2286*b1cdbd2cSJim Jagielski rStrm.skip( 1 );
2287*b1cdbd2cSJim Jagielski rStrm >> nNumFmtId >> nFlags;
2288*b1cdbd2cSJim Jagielski
2289*b1cdbd2cSJim Jagielski // only cell XFs in BIFF2, no parent style, used flags always true
2290*b1cdbd2cSJim Jagielski setAllUsedFlags( true );
2291*b1cdbd2cSJim Jagielski
2292*b1cdbd2cSJim Jagielski // attributes
2293*b1cdbd2cSJim Jagielski maAlignment.setBiff2Data( nFlags );
2294*b1cdbd2cSJim Jagielski maProtection.setBiff2Data( nNumFmtId );
2295*b1cdbd2cSJim Jagielski xBorder->setBiff2Data( nFlags );
2296*b1cdbd2cSJim Jagielski xFill->setBiff2Data( nFlags );
2297*b1cdbd2cSJim Jagielski maModel.mnFontId = static_cast< sal_Int32 >( nFontId );
2298*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = static_cast< sal_Int32 >( nNumFmtId & BIFF2_XF_VALFMT_MASK );
2299*b1cdbd2cSJim Jagielski }
2300*b1cdbd2cSJim Jagielski break;
2301*b1cdbd2cSJim Jagielski
2302*b1cdbd2cSJim Jagielski case BIFF3:
2303*b1cdbd2cSJim Jagielski {
2304*b1cdbd2cSJim Jagielski sal_uInt32 nBorder;
2305*b1cdbd2cSJim Jagielski sal_uInt16 nTypeProt, nAlign, nArea;
2306*b1cdbd2cSJim Jagielski sal_uInt8 nFontId, nNumFmtId;
2307*b1cdbd2cSJim Jagielski rStrm >> nFontId >> nNumFmtId >> nTypeProt >> nAlign >> nArea >> nBorder;
2308*b1cdbd2cSJim Jagielski
2309*b1cdbd2cSJim Jagielski // XF type/parent
2310*b1cdbd2cSJim Jagielski maModel.mbCellXf = !getFlag( nTypeProt, BIFF_XF_STYLE ); // new in BIFF3
2311*b1cdbd2cSJim Jagielski maModel.mnStyleXfId = extractValue< sal_Int32 >( nAlign, 4, 12 ); // new in BIFF3
2312*b1cdbd2cSJim Jagielski // attribute used flags
2313*b1cdbd2cSJim Jagielski setBiffUsedFlags( extractValue< sal_uInt8 >( nTypeProt, 10, 6 ) ); // new in BIFF3
2314*b1cdbd2cSJim Jagielski
2315*b1cdbd2cSJim Jagielski // attributes
2316*b1cdbd2cSJim Jagielski maAlignment.setBiff3Data( nAlign );
2317*b1cdbd2cSJim Jagielski maProtection.setBiff3Data( nTypeProt );
2318*b1cdbd2cSJim Jagielski xBorder->setBiff3Data( nBorder );
2319*b1cdbd2cSJim Jagielski xFill->setBiff3Data( nArea );
2320*b1cdbd2cSJim Jagielski maModel.mnFontId = static_cast< sal_Int32 >( nFontId );
2321*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = static_cast< sal_Int32 >( nNumFmtId );
2322*b1cdbd2cSJim Jagielski }
2323*b1cdbd2cSJim Jagielski break;
2324*b1cdbd2cSJim Jagielski
2325*b1cdbd2cSJim Jagielski case BIFF4:
2326*b1cdbd2cSJim Jagielski {
2327*b1cdbd2cSJim Jagielski sal_uInt32 nBorder;
2328*b1cdbd2cSJim Jagielski sal_uInt16 nTypeProt, nAlign, nArea;
2329*b1cdbd2cSJim Jagielski sal_uInt8 nFontId, nNumFmtId;
2330*b1cdbd2cSJim Jagielski rStrm >> nFontId >> nNumFmtId >> nTypeProt >> nAlign >> nArea >> nBorder;
2331*b1cdbd2cSJim Jagielski
2332*b1cdbd2cSJim Jagielski // XF type/parent
2333*b1cdbd2cSJim Jagielski maModel.mbCellXf = !getFlag( nTypeProt, BIFF_XF_STYLE );
2334*b1cdbd2cSJim Jagielski maModel.mnStyleXfId = extractValue< sal_Int32 >( nTypeProt, 4, 12 );
2335*b1cdbd2cSJim Jagielski // attribute used flags
2336*b1cdbd2cSJim Jagielski setBiffUsedFlags( extractValue< sal_uInt8 >( nAlign, 10, 6 ) );
2337*b1cdbd2cSJim Jagielski
2338*b1cdbd2cSJim Jagielski // attributes
2339*b1cdbd2cSJim Jagielski maAlignment.setBiff4Data( nAlign );
2340*b1cdbd2cSJim Jagielski maProtection.setBiff3Data( nTypeProt );
2341*b1cdbd2cSJim Jagielski xBorder->setBiff3Data( nBorder );
2342*b1cdbd2cSJim Jagielski xFill->setBiff3Data( nArea );
2343*b1cdbd2cSJim Jagielski maModel.mnFontId = static_cast< sal_Int32 >( nFontId );
2344*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = static_cast< sal_Int32 >( nNumFmtId );
2345*b1cdbd2cSJim Jagielski }
2346*b1cdbd2cSJim Jagielski break;
2347*b1cdbd2cSJim Jagielski
2348*b1cdbd2cSJim Jagielski case BIFF5:
2349*b1cdbd2cSJim Jagielski {
2350*b1cdbd2cSJim Jagielski sal_uInt32 nArea, nBorder;
2351*b1cdbd2cSJim Jagielski sal_uInt16 nFontId, nNumFmtId, nTypeProt, nAlign;
2352*b1cdbd2cSJim Jagielski rStrm >> nFontId >> nNumFmtId >> nTypeProt >> nAlign >> nArea >> nBorder;
2353*b1cdbd2cSJim Jagielski
2354*b1cdbd2cSJim Jagielski // XF type/parent
2355*b1cdbd2cSJim Jagielski maModel.mbCellXf = !getFlag( nTypeProt, BIFF_XF_STYLE );
2356*b1cdbd2cSJim Jagielski maModel.mnStyleXfId = extractValue< sal_Int32 >( nTypeProt, 4, 12 );
2357*b1cdbd2cSJim Jagielski // attribute used flags
2358*b1cdbd2cSJim Jagielski setBiffUsedFlags( extractValue< sal_uInt8 >( nAlign, 10, 6 ) );
2359*b1cdbd2cSJim Jagielski
2360*b1cdbd2cSJim Jagielski // attributes
2361*b1cdbd2cSJim Jagielski maAlignment.setBiff5Data( nAlign );
2362*b1cdbd2cSJim Jagielski maProtection.setBiff3Data( nTypeProt );
2363*b1cdbd2cSJim Jagielski xBorder->setBiff5Data( nBorder, nArea );
2364*b1cdbd2cSJim Jagielski xFill->setBiff5Data( nArea );
2365*b1cdbd2cSJim Jagielski maModel.mnFontId = static_cast< sal_Int32 >( nFontId );
2366*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = static_cast< sal_Int32 >( nNumFmtId );
2367*b1cdbd2cSJim Jagielski }
2368*b1cdbd2cSJim Jagielski break;
2369*b1cdbd2cSJim Jagielski
2370*b1cdbd2cSJim Jagielski case BIFF8:
2371*b1cdbd2cSJim Jagielski {
2372*b1cdbd2cSJim Jagielski sal_uInt32 nBorder1, nBorder2;
2373*b1cdbd2cSJim Jagielski sal_uInt16 nFontId, nNumFmtId, nTypeProt, nAlign, nMiscAttrib, nArea;
2374*b1cdbd2cSJim Jagielski rStrm >> nFontId >> nNumFmtId >> nTypeProt >> nAlign >> nMiscAttrib >> nBorder1 >> nBorder2 >> nArea;
2375*b1cdbd2cSJim Jagielski
2376*b1cdbd2cSJim Jagielski // XF type/parent
2377*b1cdbd2cSJim Jagielski maModel.mbCellXf = !getFlag( nTypeProt, BIFF_XF_STYLE );
2378*b1cdbd2cSJim Jagielski maModel.mnStyleXfId = extractValue< sal_Int32 >( nTypeProt, 4, 12 );
2379*b1cdbd2cSJim Jagielski // attribute used flags
2380*b1cdbd2cSJim Jagielski setBiffUsedFlags( extractValue< sal_uInt8 >( nMiscAttrib, 10, 6 ) );
2381*b1cdbd2cSJim Jagielski
2382*b1cdbd2cSJim Jagielski // attributes
2383*b1cdbd2cSJim Jagielski maAlignment.setBiff8Data( nAlign, nMiscAttrib );
2384*b1cdbd2cSJim Jagielski maProtection.setBiff3Data( nTypeProt );
2385*b1cdbd2cSJim Jagielski xBorder->setBiff8Data( nBorder1, nBorder2 );
2386*b1cdbd2cSJim Jagielski xFill->setBiff8Data( nBorder2, nArea );
2387*b1cdbd2cSJim Jagielski maModel.mnFontId = static_cast< sal_Int32 >( nFontId );
2388*b1cdbd2cSJim Jagielski maModel.mnNumFmtId = static_cast< sal_Int32 >( nNumFmtId );
2389*b1cdbd2cSJim Jagielski }
2390*b1cdbd2cSJim Jagielski break;
2391*b1cdbd2cSJim Jagielski
2392*b1cdbd2cSJim Jagielski case BIFF_UNKNOWN: break;
2393*b1cdbd2cSJim Jagielski }
2394*b1cdbd2cSJim Jagielski }
2395*b1cdbd2cSJim Jagielski
finalizeImport()2396*b1cdbd2cSJim Jagielski void Xf::finalizeImport()
2397*b1cdbd2cSJim Jagielski {
2398*b1cdbd2cSJim Jagielski StylesBuffer& rStyles = getStyles();
2399*b1cdbd2cSJim Jagielski
2400*b1cdbd2cSJim Jagielski // alignment and protection
2401*b1cdbd2cSJim Jagielski maAlignment.finalizeImport();
2402*b1cdbd2cSJim Jagielski maProtection.finalizeImport();
2403*b1cdbd2cSJim Jagielski
2404*b1cdbd2cSJim Jagielski /* Enables the used flags, if the formatting attributes differ from the
2405*b1cdbd2cSJim Jagielski style XF. In cell XFs Excel uses the cell attributes, if they differ
2406*b1cdbd2cSJim Jagielski from the parent style XF (even if the used flag is switched off).
2407*b1cdbd2cSJim Jagielski #109899# ...or if the respective flag is not set in parent style XF.
2408*b1cdbd2cSJim Jagielski */
2409*b1cdbd2cSJim Jagielski const Xf* pStyleXf = isCellXf() ? rStyles.getStyleXf( maModel.mnStyleXfId ).get() : 0;
2410*b1cdbd2cSJim Jagielski if( pStyleXf )
2411*b1cdbd2cSJim Jagielski {
2412*b1cdbd2cSJim Jagielski const XfModel& rStyleData = pStyleXf->maModel;
2413*b1cdbd2cSJim Jagielski if( !maModel.mbFontUsed )
2414*b1cdbd2cSJim Jagielski maModel.mbFontUsed = !rStyleData.mbFontUsed || (maModel.mnFontId != rStyleData.mnFontId);
2415*b1cdbd2cSJim Jagielski if( !maModel.mbNumFmtUsed )
2416*b1cdbd2cSJim Jagielski maModel.mbNumFmtUsed = !rStyleData.mbNumFmtUsed || (maModel.mnNumFmtId != rStyleData.mnNumFmtId);
2417*b1cdbd2cSJim Jagielski if( !maModel.mbAlignUsed )
2418*b1cdbd2cSJim Jagielski maModel.mbAlignUsed = !rStyleData.mbAlignUsed || !(maAlignment.getApiData() == pStyleXf->maAlignment.getApiData());
2419*b1cdbd2cSJim Jagielski if( !maModel.mbProtUsed )
2420*b1cdbd2cSJim Jagielski maModel.mbProtUsed = !rStyleData.mbProtUsed || !(maProtection.getApiData() == pStyleXf->maProtection.getApiData());
2421*b1cdbd2cSJim Jagielski if( !maModel.mbBorderUsed )
2422*b1cdbd2cSJim Jagielski maModel.mbBorderUsed = !rStyleData.mbBorderUsed || !rStyles.equalBorders( maModel.mnBorderId, rStyleData.mnBorderId );
2423*b1cdbd2cSJim Jagielski if( !maModel.mbAreaUsed )
2424*b1cdbd2cSJim Jagielski maModel.mbAreaUsed = !rStyleData.mbAreaUsed || !rStyles.equalFills( maModel.mnFillId, rStyleData.mnFillId );
2425*b1cdbd2cSJim Jagielski }
2426*b1cdbd2cSJim Jagielski
2427*b1cdbd2cSJim Jagielski /* #i38709# Decide which rotation reference mode to use. If any outer
2428*b1cdbd2cSJim Jagielski border line of the cell is set (either explicitly or via cell style),
2429*b1cdbd2cSJim Jagielski and the cell contents are rotated, set rotation reference to bottom of
2430*b1cdbd2cSJim Jagielski cell. This causes the borders to be painted rotated with the text. */
2431*b1cdbd2cSJim Jagielski if( const Alignment* pAlignment = maModel.mbAlignUsed ? &maAlignment : (pStyleXf ? &pStyleXf->maAlignment : 0) )
2432*b1cdbd2cSJim Jagielski {
2433*b1cdbd2cSJim Jagielski sal_Int32 nBorderId = maModel.mbBorderUsed ? maModel.mnBorderId : (pStyleXf ? pStyleXf->maModel.mnBorderId : -1);
2434*b1cdbd2cSJim Jagielski if( const Border* pBorder = rStyles.getBorder( nBorderId ).get() )
2435*b1cdbd2cSJim Jagielski if( (pAlignment->getApiData().mnRotation != 0) && pBorder->getApiData().hasAnyOuterBorder() )
2436*b1cdbd2cSJim Jagielski meRotationRef = ::com::sun::star::table::CellVertJustify_BOTTOM;
2437*b1cdbd2cSJim Jagielski }
2438*b1cdbd2cSJim Jagielski }
2439*b1cdbd2cSJim Jagielski
getFont() const2440*b1cdbd2cSJim Jagielski FontRef Xf::getFont() const
2441*b1cdbd2cSJim Jagielski {
2442*b1cdbd2cSJim Jagielski return getStyles().getFont( maModel.mnFontId );
2443*b1cdbd2cSJim Jagielski }
2444*b1cdbd2cSJim Jagielski
hasAnyUsedFlags() const2445*b1cdbd2cSJim Jagielski bool Xf::hasAnyUsedFlags() const
2446*b1cdbd2cSJim Jagielski {
2447*b1cdbd2cSJim Jagielski return
2448*b1cdbd2cSJim Jagielski maModel.mbAlignUsed || maModel.mbProtUsed || maModel.mbFontUsed ||
2449*b1cdbd2cSJim Jagielski maModel.mbNumFmtUsed || maModel.mbBorderUsed || maModel.mbAreaUsed;
2450*b1cdbd2cSJim Jagielski }
2451*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap) const2452*b1cdbd2cSJim Jagielski void Xf::writeToPropertyMap( PropertyMap& rPropMap ) const
2453*b1cdbd2cSJim Jagielski {
2454*b1cdbd2cSJim Jagielski StylesBuffer& rStyles = getStyles();
2455*b1cdbd2cSJim Jagielski
2456*b1cdbd2cSJim Jagielski // create and set cell style
2457*b1cdbd2cSJim Jagielski if( isCellXf() )
2458*b1cdbd2cSJim Jagielski rPropMap[ PROP_CellStyle ] <<= rStyles.createCellStyle( maModel.mnStyleXfId );
2459*b1cdbd2cSJim Jagielski
2460*b1cdbd2cSJim Jagielski if( maModel.mbFontUsed )
2461*b1cdbd2cSJim Jagielski rStyles.writeFontToPropertyMap( rPropMap, maModel.mnFontId );
2462*b1cdbd2cSJim Jagielski if( maModel.mbNumFmtUsed )
2463*b1cdbd2cSJim Jagielski rStyles.writeNumFmtToPropertyMap( rPropMap, maModel.mnNumFmtId );
2464*b1cdbd2cSJim Jagielski if( maModel.mbAlignUsed )
2465*b1cdbd2cSJim Jagielski maAlignment.writeToPropertyMap( rPropMap );
2466*b1cdbd2cSJim Jagielski if( maModel.mbProtUsed )
2467*b1cdbd2cSJim Jagielski maProtection.writeToPropertyMap( rPropMap );
2468*b1cdbd2cSJim Jagielski if( maModel.mbBorderUsed )
2469*b1cdbd2cSJim Jagielski rStyles.writeBorderToPropertyMap( rPropMap, maModel.mnBorderId );
2470*b1cdbd2cSJim Jagielski if( maModel.mbAreaUsed )
2471*b1cdbd2cSJim Jagielski rStyles.writeFillToPropertyMap( rPropMap, maModel.mnFillId );
2472*b1cdbd2cSJim Jagielski if( maModel.mbAlignUsed || maModel.mbBorderUsed )
2473*b1cdbd2cSJim Jagielski rPropMap[ PROP_RotateReference ] <<= meRotationRef;
2474*b1cdbd2cSJim Jagielski }
2475*b1cdbd2cSJim Jagielski
writeToPropertySet(PropertySet & rPropSet) const2476*b1cdbd2cSJim Jagielski void Xf::writeToPropertySet( PropertySet& rPropSet ) const
2477*b1cdbd2cSJim Jagielski {
2478*b1cdbd2cSJim Jagielski PropertyMap aPropMap;
2479*b1cdbd2cSJim Jagielski writeToPropertyMap( aPropMap );
2480*b1cdbd2cSJim Jagielski rPropSet.setProperties( aPropMap );
2481*b1cdbd2cSJim Jagielski }
2482*b1cdbd2cSJim Jagielski
writeBiff2CellFormatToPropertySet(const WorkbookHelper & rHelper,PropertySet & rPropSet,sal_uInt8 nFlags1,sal_uInt8 nFlags2,sal_uInt8 nFlags3)2483*b1cdbd2cSJim Jagielski /*static*/ void Xf::writeBiff2CellFormatToPropertySet( const WorkbookHelper& rHelper,
2484*b1cdbd2cSJim Jagielski PropertySet& rPropSet, sal_uInt8 nFlags1, sal_uInt8 nFlags2, sal_uInt8 nFlags3 )
2485*b1cdbd2cSJim Jagielski {
2486*b1cdbd2cSJim Jagielski /* Create an XF object and let it do the work. We will have access to its
2487*b1cdbd2cSJim Jagielski private members here. Also, create temporary border and fill objects,
2488*b1cdbd2cSJim Jagielski this prevents polluting the border and fill buffers with new temporary
2489*b1cdbd2cSJim Jagielski objects per imported cell. */
2490*b1cdbd2cSJim Jagielski Xf aXf( rHelper );
2491*b1cdbd2cSJim Jagielski Border aBorder( rHelper, false );
2492*b1cdbd2cSJim Jagielski Fill aFill( rHelper, false );
2493*b1cdbd2cSJim Jagielski
2494*b1cdbd2cSJim Jagielski // no used flags available in BIFF2 (always true)
2495*b1cdbd2cSJim Jagielski aXf.setAllUsedFlags( true );
2496*b1cdbd2cSJim Jagielski
2497*b1cdbd2cSJim Jagielski // set the attributes
2498*b1cdbd2cSJim Jagielski aXf.maModel.mnFontId = extractValue< sal_Int32 >( nFlags2, 6, 2 );
2499*b1cdbd2cSJim Jagielski aXf.maModel.mnNumFmtId = extractValue< sal_Int32 >( nFlags2, 0, 6 );
2500*b1cdbd2cSJim Jagielski aXf.maAlignment.setBiff2Data( nFlags3 );
2501*b1cdbd2cSJim Jagielski aXf.maProtection.setBiff2Data( nFlags1 );
2502*b1cdbd2cSJim Jagielski aBorder.setBiff2Data( nFlags3 );
2503*b1cdbd2cSJim Jagielski aFill.setBiff2Data( nFlags3 );
2504*b1cdbd2cSJim Jagielski
2505*b1cdbd2cSJim Jagielski // finalize the objects (convert model to API attributes)
2506*b1cdbd2cSJim Jagielski aXf.finalizeImport();
2507*b1cdbd2cSJim Jagielski aBorder.finalizeImport();
2508*b1cdbd2cSJim Jagielski aFill.finalizeImport();
2509*b1cdbd2cSJim Jagielski
2510*b1cdbd2cSJim Jagielski // write the properties to the property set
2511*b1cdbd2cSJim Jagielski PropertyMap aPropMap;
2512*b1cdbd2cSJim Jagielski aXf.writeToPropertyMap( aPropMap );
2513*b1cdbd2cSJim Jagielski aBorder.writeToPropertyMap( aPropMap );
2514*b1cdbd2cSJim Jagielski aFill.writeToPropertyMap( aPropMap );
2515*b1cdbd2cSJim Jagielski rPropSet.setProperties( aPropMap );
2516*b1cdbd2cSJim Jagielski }
2517*b1cdbd2cSJim Jagielski
setBiffUsedFlags(sal_uInt8 nUsedFlags)2518*b1cdbd2cSJim Jagielski void Xf::setBiffUsedFlags( sal_uInt8 nUsedFlags )
2519*b1cdbd2cSJim Jagielski {
2520*b1cdbd2cSJim Jagielski /* Notes about finding the used flags:
2521*b1cdbd2cSJim Jagielski - In cell XFs a *set* bit means a used attribute.
2522*b1cdbd2cSJim Jagielski - In style XFs a *cleared* bit means a used attribute.
2523*b1cdbd2cSJim Jagielski The boolean flags always store true, if the attribute is used.
2524*b1cdbd2cSJim Jagielski The "isCellXf() == getFlag(...)" construct evaluates to true in both
2525*b1cdbd2cSJim Jagielski mentioned cases: cell XF and set bit; or style XF and cleared bit.
2526*b1cdbd2cSJim Jagielski */
2527*b1cdbd2cSJim Jagielski maModel.mbFontUsed = isCellXf() == getFlag( nUsedFlags, BIFF_XF_FONT_USED );
2528*b1cdbd2cSJim Jagielski maModel.mbNumFmtUsed = isCellXf() == getFlag( nUsedFlags, BIFF_XF_NUMFMT_USED );
2529*b1cdbd2cSJim Jagielski maModel.mbAlignUsed = isCellXf() == getFlag( nUsedFlags, BIFF_XF_ALIGN_USED );
2530*b1cdbd2cSJim Jagielski maModel.mbProtUsed = isCellXf() == getFlag( nUsedFlags, BIFF_XF_PROT_USED );
2531*b1cdbd2cSJim Jagielski maModel.mbBorderUsed = isCellXf() == getFlag( nUsedFlags, BIFF_XF_BORDER_USED );
2532*b1cdbd2cSJim Jagielski maModel.mbAreaUsed = isCellXf() == getFlag( nUsedFlags, BIFF_XF_AREA_USED );
2533*b1cdbd2cSJim Jagielski }
2534*b1cdbd2cSJim Jagielski
2535*b1cdbd2cSJim Jagielski // ============================================================================
2536*b1cdbd2cSJim Jagielski
Dxf(const WorkbookHelper & rHelper)2537*b1cdbd2cSJim Jagielski Dxf::Dxf( const WorkbookHelper& rHelper ) :
2538*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper )
2539*b1cdbd2cSJim Jagielski {
2540*b1cdbd2cSJim Jagielski }
2541*b1cdbd2cSJim Jagielski
createFont(bool bAlwaysNew)2542*b1cdbd2cSJim Jagielski FontRef Dxf::createFont( bool bAlwaysNew )
2543*b1cdbd2cSJim Jagielski {
2544*b1cdbd2cSJim Jagielski if( bAlwaysNew || !mxFont )
2545*b1cdbd2cSJim Jagielski mxFont.reset( new Font( *this, true ) );
2546*b1cdbd2cSJim Jagielski return mxFont;
2547*b1cdbd2cSJim Jagielski }
2548*b1cdbd2cSJim Jagielski
createBorder(bool bAlwaysNew)2549*b1cdbd2cSJim Jagielski BorderRef Dxf::createBorder( bool bAlwaysNew )
2550*b1cdbd2cSJim Jagielski {
2551*b1cdbd2cSJim Jagielski if( bAlwaysNew || !mxBorder )
2552*b1cdbd2cSJim Jagielski mxBorder.reset( new Border( *this, true ) );
2553*b1cdbd2cSJim Jagielski return mxBorder;
2554*b1cdbd2cSJim Jagielski }
2555*b1cdbd2cSJim Jagielski
createFill(bool bAlwaysNew)2556*b1cdbd2cSJim Jagielski FillRef Dxf::createFill( bool bAlwaysNew )
2557*b1cdbd2cSJim Jagielski {
2558*b1cdbd2cSJim Jagielski if( bAlwaysNew || !mxFill )
2559*b1cdbd2cSJim Jagielski mxFill.reset( new Fill( *this, true ) );
2560*b1cdbd2cSJim Jagielski return mxFill;
2561*b1cdbd2cSJim Jagielski }
2562*b1cdbd2cSJim Jagielski
importNumFmt(const AttributeList & rAttribs)2563*b1cdbd2cSJim Jagielski void Dxf::importNumFmt( const AttributeList& rAttribs )
2564*b1cdbd2cSJim Jagielski {
2565*b1cdbd2cSJim Jagielski mxNumFmt = getStyles().importNumFmt( rAttribs );
2566*b1cdbd2cSJim Jagielski }
2567*b1cdbd2cSJim Jagielski
importAlignment(const AttributeList & rAttribs)2568*b1cdbd2cSJim Jagielski void Dxf::importAlignment( const AttributeList& rAttribs )
2569*b1cdbd2cSJim Jagielski {
2570*b1cdbd2cSJim Jagielski mxAlignment.reset( new Alignment( *this ) );
2571*b1cdbd2cSJim Jagielski mxAlignment->importAlignment( rAttribs );
2572*b1cdbd2cSJim Jagielski }
2573*b1cdbd2cSJim Jagielski
importProtection(const AttributeList & rAttribs)2574*b1cdbd2cSJim Jagielski void Dxf::importProtection( const AttributeList& rAttribs )
2575*b1cdbd2cSJim Jagielski {
2576*b1cdbd2cSJim Jagielski mxProtection.reset( new Protection( *this ) );
2577*b1cdbd2cSJim Jagielski mxProtection->importProtection( rAttribs );
2578*b1cdbd2cSJim Jagielski }
2579*b1cdbd2cSJim Jagielski
importDxf(SequenceInputStream & rStrm)2580*b1cdbd2cSJim Jagielski void Dxf::importDxf( SequenceInputStream& rStrm )
2581*b1cdbd2cSJim Jagielski {
2582*b1cdbd2cSJim Jagielski sal_Int32 nNumFmtId = -1;
2583*b1cdbd2cSJim Jagielski OUString aFmtCode;
2584*b1cdbd2cSJim Jagielski sal_uInt16 nRecCount;
2585*b1cdbd2cSJim Jagielski rStrm.skip( 4 ); // flags
2586*b1cdbd2cSJim Jagielski rStrm >> nRecCount;
2587*b1cdbd2cSJim Jagielski for( sal_uInt16 nRec = 0; !rStrm.isEof() && (nRec < nRecCount); ++nRec )
2588*b1cdbd2cSJim Jagielski {
2589*b1cdbd2cSJim Jagielski sal_uInt16 nSubRecId, nSubRecSize;
2590*b1cdbd2cSJim Jagielski sal_Int64 nRecEnd = rStrm.tell();
2591*b1cdbd2cSJim Jagielski rStrm >> nSubRecId >> nSubRecSize;
2592*b1cdbd2cSJim Jagielski nRecEnd += nSubRecSize;
2593*b1cdbd2cSJim Jagielski switch( nSubRecId )
2594*b1cdbd2cSJim Jagielski {
2595*b1cdbd2cSJim Jagielski case BIFF12_DXF_FILL_PATTERN: createFill( false )->importDxfPattern( rStrm ); break;
2596*b1cdbd2cSJim Jagielski case BIFF12_DXF_FILL_FGCOLOR: createFill( false )->importDxfFgColor( rStrm ); break;
2597*b1cdbd2cSJim Jagielski case BIFF12_DXF_FILL_BGCOLOR: createFill( false )->importDxfBgColor( rStrm ); break;
2598*b1cdbd2cSJim Jagielski case BIFF12_DXF_FILL_GRADIENT: createFill( false )->importDxfGradient( rStrm ); break;
2599*b1cdbd2cSJim Jagielski case BIFF12_DXF_FILL_STOP: createFill( false )->importDxfStop( rStrm ); break;
2600*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_COLOR: createFont( false )->importDxfColor( rStrm ); break;
2601*b1cdbd2cSJim Jagielski case BIFF12_DXF_BORDER_TOP: createBorder( false )->importDxfBorder( XLS_TOKEN( top ), rStrm ); break;
2602*b1cdbd2cSJim Jagielski case BIFF12_DXF_BORDER_BOTTOM: createBorder( false )->importDxfBorder( XLS_TOKEN( bottom ), rStrm ); break;
2603*b1cdbd2cSJim Jagielski case BIFF12_DXF_BORDER_LEFT: createBorder( false )->importDxfBorder( XLS_TOKEN( left ), rStrm ); break;
2604*b1cdbd2cSJim Jagielski case BIFF12_DXF_BORDER_RIGHT: createBorder( false )->importDxfBorder( XLS_TOKEN( right ), rStrm ); break;
2605*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_NAME: createFont( false )->importDxfName( rStrm ); break;
2606*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_WEIGHT: createFont( false )->importDxfWeight( rStrm ); break;
2607*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_UNDERLINE: createFont( false )->importDxfUnderline( rStrm ); break;
2608*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_ESCAPEMENT: createFont( false )->importDxfEscapement( rStrm ); break;
2609*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_ITALIC: createFont( false )->importDxfFlag( XML_i, rStrm ); break;
2610*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_STRIKE: createFont( false )->importDxfFlag( XML_strike, rStrm ); break;
2611*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_OUTLINE: createFont( false )->importDxfFlag( XML_outline, rStrm ); break;
2612*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_SHADOW: createFont( false )->importDxfFlag( XML_shadow, rStrm ); break;
2613*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_HEIGHT: createFont( false )->importDxfHeight( rStrm ); break;
2614*b1cdbd2cSJim Jagielski case BIFF12_DXF_FONT_SCHEME: createFont( false )->importDxfScheme( rStrm ); break;
2615*b1cdbd2cSJim Jagielski case BIFF12_DXF_NUMFMT_CODE: aFmtCode = BiffHelper::readString( rStrm, false ); break;
2616*b1cdbd2cSJim Jagielski case BIFF12_DXF_NUMFMT_ID: nNumFmtId = rStrm.readuInt16(); break;
2617*b1cdbd2cSJim Jagielski }
2618*b1cdbd2cSJim Jagielski rStrm.seek( nRecEnd );
2619*b1cdbd2cSJim Jagielski }
2620*b1cdbd2cSJim Jagielski OSL_ENSURE( !rStrm.isEof() && (rStrm.getRemaining() == 0), "Dxf::importDxf - unexpected remaining data" );
2621*b1cdbd2cSJim Jagielski mxNumFmt = getStyles().createNumFmt( nNumFmtId, aFmtCode );
2622*b1cdbd2cSJim Jagielski }
2623*b1cdbd2cSJim Jagielski
importCfRule(BiffInputStream & rStrm,sal_uInt32 nFlags)2624*b1cdbd2cSJim Jagielski void Dxf::importCfRule( BiffInputStream& rStrm, sal_uInt32 nFlags )
2625*b1cdbd2cSJim Jagielski {
2626*b1cdbd2cSJim Jagielski if( getFlag( nFlags, BIFF_CFRULE_FONTBLOCK ) )
2627*b1cdbd2cSJim Jagielski createFont()->importCfRule( rStrm );
2628*b1cdbd2cSJim Jagielski if( getFlag( nFlags, BIFF_CFRULE_ALIGNBLOCK ) )
2629*b1cdbd2cSJim Jagielski rStrm.skip( 8 );
2630*b1cdbd2cSJim Jagielski if( getFlag( nFlags, BIFF_CFRULE_BORDERBLOCK ) )
2631*b1cdbd2cSJim Jagielski createBorder()->importCfRule( rStrm, nFlags );
2632*b1cdbd2cSJim Jagielski if( getFlag( nFlags, BIFF_CFRULE_FILLBLOCK ) )
2633*b1cdbd2cSJim Jagielski createFill()->importCfRule( rStrm, nFlags );
2634*b1cdbd2cSJim Jagielski if( getFlag( nFlags, BIFF_CFRULE_PROTBLOCK ) )
2635*b1cdbd2cSJim Jagielski rStrm.skip( 2 );
2636*b1cdbd2cSJim Jagielski }
2637*b1cdbd2cSJim Jagielski
finalizeImport()2638*b1cdbd2cSJim Jagielski void Dxf::finalizeImport()
2639*b1cdbd2cSJim Jagielski {
2640*b1cdbd2cSJim Jagielski if( mxFont.get() )
2641*b1cdbd2cSJim Jagielski mxFont->finalizeImport();
2642*b1cdbd2cSJim Jagielski // number format already finalized by the number formats buffer
2643*b1cdbd2cSJim Jagielski if( mxAlignment.get() )
2644*b1cdbd2cSJim Jagielski mxAlignment->finalizeImport();
2645*b1cdbd2cSJim Jagielski if( mxProtection.get() )
2646*b1cdbd2cSJim Jagielski mxProtection->finalizeImport();
2647*b1cdbd2cSJim Jagielski if( mxBorder.get() )
2648*b1cdbd2cSJim Jagielski mxBorder->finalizeImport();
2649*b1cdbd2cSJim Jagielski if( mxFill.get() )
2650*b1cdbd2cSJim Jagielski mxFill->finalizeImport();
2651*b1cdbd2cSJim Jagielski }
2652*b1cdbd2cSJim Jagielski
writeToPropertyMap(PropertyMap & rPropMap) const2653*b1cdbd2cSJim Jagielski void Dxf::writeToPropertyMap( PropertyMap& rPropMap ) const
2654*b1cdbd2cSJim Jagielski {
2655*b1cdbd2cSJim Jagielski if( mxFont.get() )
2656*b1cdbd2cSJim Jagielski mxFont->writeToPropertyMap( rPropMap, FONT_PROPTYPE_CELL );
2657*b1cdbd2cSJim Jagielski if( mxNumFmt.get() )
2658*b1cdbd2cSJim Jagielski mxNumFmt->writeToPropertyMap( rPropMap );
2659*b1cdbd2cSJim Jagielski if( mxAlignment.get() )
2660*b1cdbd2cSJim Jagielski mxAlignment->writeToPropertyMap( rPropMap );
2661*b1cdbd2cSJim Jagielski if( mxProtection.get() )
2662*b1cdbd2cSJim Jagielski mxProtection->writeToPropertyMap( rPropMap );
2663*b1cdbd2cSJim Jagielski if( mxBorder.get() )
2664*b1cdbd2cSJim Jagielski mxBorder->writeToPropertyMap( rPropMap );
2665*b1cdbd2cSJim Jagielski if( mxFill.get() )
2666*b1cdbd2cSJim Jagielski mxFill->writeToPropertyMap( rPropMap );
2667*b1cdbd2cSJim Jagielski }
2668*b1cdbd2cSJim Jagielski
writeToPropertySet(PropertySet & rPropSet) const2669*b1cdbd2cSJim Jagielski void Dxf::writeToPropertySet( PropertySet& rPropSet ) const
2670*b1cdbd2cSJim Jagielski {
2671*b1cdbd2cSJim Jagielski PropertyMap aPropMap;
2672*b1cdbd2cSJim Jagielski writeToPropertyMap( aPropMap );
2673*b1cdbd2cSJim Jagielski rPropSet.setProperties( aPropMap );
2674*b1cdbd2cSJim Jagielski }
2675*b1cdbd2cSJim Jagielski
2676*b1cdbd2cSJim Jagielski // ============================================================================
2677*b1cdbd2cSJim Jagielski
2678*b1cdbd2cSJim Jagielski namespace {
2679*b1cdbd2cSJim Jagielski
2680*b1cdbd2cSJim Jagielski const sal_Char* const spcLegacyStyleNamePrefix = "Excel_BuiltIn_";
2681*b1cdbd2cSJim Jagielski const sal_Char* const sppcLegacyStyleNames[] =
2682*b1cdbd2cSJim Jagielski {
2683*b1cdbd2cSJim Jagielski "Normal",
2684*b1cdbd2cSJim Jagielski "RowLevel_", // outline level will be appended
2685*b1cdbd2cSJim Jagielski "ColumnLevel_", // outline level will be appended
2686*b1cdbd2cSJim Jagielski "Comma",
2687*b1cdbd2cSJim Jagielski "Currency",
2688*b1cdbd2cSJim Jagielski "Percent",
2689*b1cdbd2cSJim Jagielski "Comma_0", // new in BIFF4
2690*b1cdbd2cSJim Jagielski "Currency_0",
2691*b1cdbd2cSJim Jagielski "Hyperlink", // new in BIFF8
2692*b1cdbd2cSJim Jagielski "Followed_Hyperlink"
2693*b1cdbd2cSJim Jagielski };
2694*b1cdbd2cSJim Jagielski const sal_Int32 snLegacyStyleNamesCount = static_cast< sal_Int32 >( STATIC_ARRAY_SIZE( sppcLegacyStyleNames ) );
2695*b1cdbd2cSJim Jagielski
2696*b1cdbd2cSJim Jagielski const sal_Char* const spcStyleNamePrefix = "Excel Built-in ";
2697*b1cdbd2cSJim Jagielski const sal_Char* const sppcStyleNames[] =
2698*b1cdbd2cSJim Jagielski {
2699*b1cdbd2cSJim Jagielski "Normal",
2700*b1cdbd2cSJim Jagielski "RowLevel_", // outline level will be appended
2701*b1cdbd2cSJim Jagielski "ColLevel_", // outline level will be appended
2702*b1cdbd2cSJim Jagielski "Comma",
2703*b1cdbd2cSJim Jagielski "Currency",
2704*b1cdbd2cSJim Jagielski "Percent",
2705*b1cdbd2cSJim Jagielski "Comma [0]", // new in BIFF4
2706*b1cdbd2cSJim Jagielski "Currency [0]",
2707*b1cdbd2cSJim Jagielski "Hyperlink", // new in BIFF8
2708*b1cdbd2cSJim Jagielski "Followed Hyperlink",
2709*b1cdbd2cSJim Jagielski "Note", // new in OOX
2710*b1cdbd2cSJim Jagielski "Warning Text",
2711*b1cdbd2cSJim Jagielski 0,
2712*b1cdbd2cSJim Jagielski 0,
2713*b1cdbd2cSJim Jagielski 0,
2714*b1cdbd2cSJim Jagielski "Title",
2715*b1cdbd2cSJim Jagielski "Heading 1",
2716*b1cdbd2cSJim Jagielski "Heading 2",
2717*b1cdbd2cSJim Jagielski "Heading 3",
2718*b1cdbd2cSJim Jagielski "Heading 4",
2719*b1cdbd2cSJim Jagielski "Input",
2720*b1cdbd2cSJim Jagielski "Output",
2721*b1cdbd2cSJim Jagielski "Calculation",
2722*b1cdbd2cSJim Jagielski "Check Cell",
2723*b1cdbd2cSJim Jagielski "Linked Cell",
2724*b1cdbd2cSJim Jagielski "Total",
2725*b1cdbd2cSJim Jagielski "Good",
2726*b1cdbd2cSJim Jagielski "Bad",
2727*b1cdbd2cSJim Jagielski "Neutral",
2728*b1cdbd2cSJim Jagielski "Accent1",
2729*b1cdbd2cSJim Jagielski "20% - Accent1",
2730*b1cdbd2cSJim Jagielski "40% - Accent1",
2731*b1cdbd2cSJim Jagielski "60% - Accent1",
2732*b1cdbd2cSJim Jagielski "Accent2",
2733*b1cdbd2cSJim Jagielski "20% - Accent2",
2734*b1cdbd2cSJim Jagielski "40% - Accent2",
2735*b1cdbd2cSJim Jagielski "60% - Accent2",
2736*b1cdbd2cSJim Jagielski "Accent3",
2737*b1cdbd2cSJim Jagielski "20% - Accent3",
2738*b1cdbd2cSJim Jagielski "40% - Accent3",
2739*b1cdbd2cSJim Jagielski "60% - Accent3",
2740*b1cdbd2cSJim Jagielski "Accent4",
2741*b1cdbd2cSJim Jagielski "20% - Accent4",
2742*b1cdbd2cSJim Jagielski "40% - Accent4",
2743*b1cdbd2cSJim Jagielski "60% - Accent4",
2744*b1cdbd2cSJim Jagielski "Accent5",
2745*b1cdbd2cSJim Jagielski "20% - Accent5",
2746*b1cdbd2cSJim Jagielski "40% - Accent5",
2747*b1cdbd2cSJim Jagielski "60% - Accent5",
2748*b1cdbd2cSJim Jagielski "Accent6",
2749*b1cdbd2cSJim Jagielski "20% - Accent6",
2750*b1cdbd2cSJim Jagielski "40% - Accent6",
2751*b1cdbd2cSJim Jagielski "60% - Accent6",
2752*b1cdbd2cSJim Jagielski "Explanatory Text"
2753*b1cdbd2cSJim Jagielski };
2754*b1cdbd2cSJim Jagielski const sal_Int32 snStyleNamesCount = static_cast< sal_Int32 >( STATIC_ARRAY_SIZE( sppcStyleNames ) );
2755*b1cdbd2cSJim Jagielski
lclGetBuiltinStyleName(sal_Int32 nBuiltinId,const OUString & rName,sal_Int32 nLevel=0)2756*b1cdbd2cSJim Jagielski OUString lclGetBuiltinStyleName( sal_Int32 nBuiltinId, const OUString& rName, sal_Int32 nLevel = 0 )
2757*b1cdbd2cSJim Jagielski {
2758*b1cdbd2cSJim Jagielski OSL_ENSURE( (0 <= nBuiltinId) && (nBuiltinId < snStyleNamesCount), "lclGetBuiltinStyleName - unknown built-in style" );
2759*b1cdbd2cSJim Jagielski OUStringBuffer aStyleName;
2760*b1cdbd2cSJim Jagielski aStyleName.appendAscii( spcStyleNamePrefix );
2761*b1cdbd2cSJim Jagielski if( (0 <= nBuiltinId) && (nBuiltinId < snStyleNamesCount) && (sppcStyleNames[ nBuiltinId ] != 0) )
2762*b1cdbd2cSJim Jagielski aStyleName.appendAscii( sppcStyleNames[ nBuiltinId ] );
2763*b1cdbd2cSJim Jagielski else if( rName.getLength() > 0 )
2764*b1cdbd2cSJim Jagielski aStyleName.append( rName );
2765*b1cdbd2cSJim Jagielski else
2766*b1cdbd2cSJim Jagielski aStyleName.append( nBuiltinId );
2767*b1cdbd2cSJim Jagielski if( (nBuiltinId == OOX_STYLE_ROWLEVEL) || (nBuiltinId == OOX_STYLE_COLLEVEL) )
2768*b1cdbd2cSJim Jagielski aStyleName.append( nLevel );
2769*b1cdbd2cSJim Jagielski return aStyleName.makeStringAndClear();
2770*b1cdbd2cSJim Jagielski }
2771*b1cdbd2cSJim Jagielski
lclCreateStyleName(const CellStyleModel & rModel)2772*b1cdbd2cSJim Jagielski OUString lclCreateStyleName( const CellStyleModel& rModel )
2773*b1cdbd2cSJim Jagielski {
2774*b1cdbd2cSJim Jagielski return rModel.mbBuiltin ? lclGetBuiltinStyleName( rModel.mnBuiltinId, rModel.maName, rModel.mnLevel ) : rModel.maName;
2775*b1cdbd2cSJim Jagielski }
2776*b1cdbd2cSJim Jagielski
lclIsBuiltinStyleName(const OUString & rStyleName,sal_Int32 * pnBuiltinId,sal_Int32 * pnNextChar)2777*b1cdbd2cSJim Jagielski bool lclIsBuiltinStyleName( const OUString& rStyleName, sal_Int32* pnBuiltinId, sal_Int32* pnNextChar )
2778*b1cdbd2cSJim Jagielski {
2779*b1cdbd2cSJim Jagielski // try the other built-in styles
2780*b1cdbd2cSJim Jagielski OUString aPrefix = OUString::createFromAscii( spcStyleNamePrefix );
2781*b1cdbd2cSJim Jagielski sal_Int32 nPrefixLen = aPrefix.getLength();
2782*b1cdbd2cSJim Jagielski sal_Int32 nFoundId = 0;
2783*b1cdbd2cSJim Jagielski sal_Int32 nNextChar = 0;
2784*b1cdbd2cSJim Jagielski if( rStyleName.matchIgnoreAsciiCase( aPrefix ) )
2785*b1cdbd2cSJim Jagielski {
2786*b1cdbd2cSJim Jagielski OUString aShortName;
2787*b1cdbd2cSJim Jagielski for( sal_Int32 nId = 0; nId < snStyleNamesCount; ++nId )
2788*b1cdbd2cSJim Jagielski {
2789*b1cdbd2cSJim Jagielski if( sppcStyleNames[ nId ] != 0 )
2790*b1cdbd2cSJim Jagielski {
2791*b1cdbd2cSJim Jagielski aShortName = OUString::createFromAscii( sppcStyleNames[ nId ] );
2792*b1cdbd2cSJim Jagielski if( rStyleName.matchIgnoreAsciiCase( aShortName, nPrefixLen ) &&
2793*b1cdbd2cSJim Jagielski (nNextChar < nPrefixLen + aShortName.getLength()) )
2794*b1cdbd2cSJim Jagielski {
2795*b1cdbd2cSJim Jagielski nFoundId = nId;
2796*b1cdbd2cSJim Jagielski nNextChar = nPrefixLen + aShortName.getLength();
2797*b1cdbd2cSJim Jagielski }
2798*b1cdbd2cSJim Jagielski }
2799*b1cdbd2cSJim Jagielski }
2800*b1cdbd2cSJim Jagielski }
2801*b1cdbd2cSJim Jagielski
2802*b1cdbd2cSJim Jagielski if( nNextChar > 0 )
2803*b1cdbd2cSJim Jagielski {
2804*b1cdbd2cSJim Jagielski if( pnBuiltinId ) *pnBuiltinId = nFoundId;
2805*b1cdbd2cSJim Jagielski if( pnNextChar ) *pnNextChar = nNextChar;
2806*b1cdbd2cSJim Jagielski return true;
2807*b1cdbd2cSJim Jagielski }
2808*b1cdbd2cSJim Jagielski
2809*b1cdbd2cSJim Jagielski if( pnBuiltinId ) *pnBuiltinId = -1;
2810*b1cdbd2cSJim Jagielski if( pnNextChar ) *pnNextChar = 0;
2811*b1cdbd2cSJim Jagielski return false;
2812*b1cdbd2cSJim Jagielski }
2813*b1cdbd2cSJim Jagielski
lclGetBuiltinStyleId(sal_Int32 & rnBuiltinId,sal_Int32 & rnLevel,const OUString & rStyleName)2814*b1cdbd2cSJim Jagielski bool lclGetBuiltinStyleId( sal_Int32& rnBuiltinId, sal_Int32& rnLevel, const OUString& rStyleName )
2815*b1cdbd2cSJim Jagielski {
2816*b1cdbd2cSJim Jagielski sal_Int32 nBuiltinId;
2817*b1cdbd2cSJim Jagielski sal_Int32 nNextChar;
2818*b1cdbd2cSJim Jagielski if( lclIsBuiltinStyleName( rStyleName, &nBuiltinId, &nNextChar ) )
2819*b1cdbd2cSJim Jagielski {
2820*b1cdbd2cSJim Jagielski if( (nBuiltinId == OOX_STYLE_ROWLEVEL) || (nBuiltinId == OOX_STYLE_COLLEVEL) )
2821*b1cdbd2cSJim Jagielski {
2822*b1cdbd2cSJim Jagielski OUString aLevel = rStyleName.copy( nNextChar );
2823*b1cdbd2cSJim Jagielski sal_Int32 nLevel = aLevel.toInt32();
2824*b1cdbd2cSJim Jagielski if( (0 < nLevel) && (nLevel <= OOX_STYLE_LEVELCOUNT) )
2825*b1cdbd2cSJim Jagielski {
2826*b1cdbd2cSJim Jagielski rnBuiltinId = nBuiltinId;
2827*b1cdbd2cSJim Jagielski rnLevel = nLevel;
2828*b1cdbd2cSJim Jagielski return true;
2829*b1cdbd2cSJim Jagielski }
2830*b1cdbd2cSJim Jagielski }
2831*b1cdbd2cSJim Jagielski else if( rStyleName.getLength() == nNextChar )
2832*b1cdbd2cSJim Jagielski {
2833*b1cdbd2cSJim Jagielski rnBuiltinId = nBuiltinId;
2834*b1cdbd2cSJim Jagielski rnLevel = 0;
2835*b1cdbd2cSJim Jagielski return true;
2836*b1cdbd2cSJim Jagielski }
2837*b1cdbd2cSJim Jagielski }
2838*b1cdbd2cSJim Jagielski rnBuiltinId = -1;
2839*b1cdbd2cSJim Jagielski rnLevel = 0;
2840*b1cdbd2cSJim Jagielski return false;
2841*b1cdbd2cSJim Jagielski }
2842*b1cdbd2cSJim Jagielski
2843*b1cdbd2cSJim Jagielski } // namespace
2844*b1cdbd2cSJim Jagielski
2845*b1cdbd2cSJim Jagielski // ----------------------------------------------------------------------------
2846*b1cdbd2cSJim Jagielski
CellStyleModel()2847*b1cdbd2cSJim Jagielski CellStyleModel::CellStyleModel() :
2848*b1cdbd2cSJim Jagielski mnXfId( -1 ),
2849*b1cdbd2cSJim Jagielski mnBuiltinId( -1 ),
2850*b1cdbd2cSJim Jagielski mnLevel( 0 ),
2851*b1cdbd2cSJim Jagielski mbBuiltin( false ),
2852*b1cdbd2cSJim Jagielski mbCustom( false ),
2853*b1cdbd2cSJim Jagielski mbHidden( false )
2854*b1cdbd2cSJim Jagielski {
2855*b1cdbd2cSJim Jagielski }
2856*b1cdbd2cSJim Jagielski
isBuiltin() const2857*b1cdbd2cSJim Jagielski bool CellStyleModel::isBuiltin() const
2858*b1cdbd2cSJim Jagielski {
2859*b1cdbd2cSJim Jagielski return mbBuiltin && (mnBuiltinId >= 0);
2860*b1cdbd2cSJim Jagielski }
2861*b1cdbd2cSJim Jagielski
isDefaultStyle() const2862*b1cdbd2cSJim Jagielski bool CellStyleModel::isDefaultStyle() const
2863*b1cdbd2cSJim Jagielski {
2864*b1cdbd2cSJim Jagielski return mbBuiltin && (mnBuiltinId == OOX_STYLE_NORMAL);
2865*b1cdbd2cSJim Jagielski }
2866*b1cdbd2cSJim Jagielski
2867*b1cdbd2cSJim Jagielski // ============================================================================
2868*b1cdbd2cSJim Jagielski
CellStyle(const WorkbookHelper & rHelper)2869*b1cdbd2cSJim Jagielski CellStyle::CellStyle( const WorkbookHelper& rHelper ) :
2870*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
2871*b1cdbd2cSJim Jagielski mbCreated( false )
2872*b1cdbd2cSJim Jagielski {
2873*b1cdbd2cSJim Jagielski }
2874*b1cdbd2cSJim Jagielski
importCellStyle(const AttributeList & rAttribs)2875*b1cdbd2cSJim Jagielski void CellStyle::importCellStyle( const AttributeList& rAttribs )
2876*b1cdbd2cSJim Jagielski {
2877*b1cdbd2cSJim Jagielski maModel.maName = rAttribs.getXString( XML_name, OUString() );
2878*b1cdbd2cSJim Jagielski maModel.mnXfId = rAttribs.getInteger( XML_xfId, -1 );
2879*b1cdbd2cSJim Jagielski maModel.mnBuiltinId = rAttribs.getInteger( XML_builtinId, -1 );
2880*b1cdbd2cSJim Jagielski maModel.mnLevel = rAttribs.getInteger( XML_iLevel, 0 );
2881*b1cdbd2cSJim Jagielski maModel.mbBuiltin = rAttribs.hasAttribute( XML_builtinId );
2882*b1cdbd2cSJim Jagielski maModel.mbCustom = rAttribs.getBool( XML_customBuiltin, false );
2883*b1cdbd2cSJim Jagielski maModel.mbHidden = rAttribs.getBool( XML_hidden, false );
2884*b1cdbd2cSJim Jagielski }
2885*b1cdbd2cSJim Jagielski
importCellStyle(SequenceInputStream & rStrm)2886*b1cdbd2cSJim Jagielski void CellStyle::importCellStyle( SequenceInputStream& rStrm )
2887*b1cdbd2cSJim Jagielski {
2888*b1cdbd2cSJim Jagielski sal_uInt16 nFlags;
2889*b1cdbd2cSJim Jagielski rStrm >> maModel.mnXfId >> nFlags;
2890*b1cdbd2cSJim Jagielski maModel.mnBuiltinId = rStrm.readInt8();
2891*b1cdbd2cSJim Jagielski maModel.mnLevel = rStrm.readInt8();
2892*b1cdbd2cSJim Jagielski rStrm >> maModel.maName;
2893*b1cdbd2cSJim Jagielski maModel.mbBuiltin = getFlag( nFlags, BIFF12_CELLSTYLE_BUILTIN );
2894*b1cdbd2cSJim Jagielski maModel.mbCustom = getFlag( nFlags, BIFF12_CELLSTYLE_CUSTOM );
2895*b1cdbd2cSJim Jagielski maModel.mbHidden = getFlag( nFlags, BIFF12_CELLSTYLE_HIDDEN );
2896*b1cdbd2cSJim Jagielski }
2897*b1cdbd2cSJim Jagielski
importStyle(BiffInputStream & rStrm)2898*b1cdbd2cSJim Jagielski void CellStyle::importStyle( BiffInputStream& rStrm )
2899*b1cdbd2cSJim Jagielski {
2900*b1cdbd2cSJim Jagielski sal_uInt16 nStyleXf;
2901*b1cdbd2cSJim Jagielski rStrm >> nStyleXf;
2902*b1cdbd2cSJim Jagielski maModel.mnXfId = static_cast< sal_Int32 >( nStyleXf & BIFF_STYLE_XFMASK );
2903*b1cdbd2cSJim Jagielski maModel.mbBuiltin = getFlag( nStyleXf, BIFF_STYLE_BUILTIN );
2904*b1cdbd2cSJim Jagielski if( maModel.mbBuiltin )
2905*b1cdbd2cSJim Jagielski {
2906*b1cdbd2cSJim Jagielski maModel.mnBuiltinId = rStrm.readInt8();
2907*b1cdbd2cSJim Jagielski maModel.mnLevel = rStrm.readInt8();
2908*b1cdbd2cSJim Jagielski }
2909*b1cdbd2cSJim Jagielski else
2910*b1cdbd2cSJim Jagielski {
2911*b1cdbd2cSJim Jagielski maModel.maName = (getBiff() == BIFF8) ?
2912*b1cdbd2cSJim Jagielski rStrm.readUniString() : rStrm.readByteStringUC( false, getTextEncoding() );
2913*b1cdbd2cSJim Jagielski // #i103281# check if this is a new built-in style introduced in XL2007
2914*b1cdbd2cSJim Jagielski if( (getBiff() == BIFF8) && (rStrm.getNextRecId() == BIFF_ID_STYLEEXT) && rStrm.startNextRecord() )
2915*b1cdbd2cSJim Jagielski {
2916*b1cdbd2cSJim Jagielski sal_uInt8 nExtFlags;
2917*b1cdbd2cSJim Jagielski rStrm.skip( 12 );
2918*b1cdbd2cSJim Jagielski rStrm >> nExtFlags;
2919*b1cdbd2cSJim Jagielski maModel.mbBuiltin = getFlag( nExtFlags, BIFF_STYLEEXT_BUILTIN );
2920*b1cdbd2cSJim Jagielski maModel.mbCustom = getFlag( nExtFlags, BIFF_STYLEEXT_CUSTOM );
2921*b1cdbd2cSJim Jagielski maModel.mbHidden = getFlag( nExtFlags, BIFF_STYLEEXT_HIDDEN );
2922*b1cdbd2cSJim Jagielski if( maModel.mbBuiltin )
2923*b1cdbd2cSJim Jagielski {
2924*b1cdbd2cSJim Jagielski maModel.mnBuiltinId = rStrm.readInt8();
2925*b1cdbd2cSJim Jagielski maModel.mnLevel = rStrm.readInt8();
2926*b1cdbd2cSJim Jagielski }
2927*b1cdbd2cSJim Jagielski }
2928*b1cdbd2cSJim Jagielski }
2929*b1cdbd2cSJim Jagielski }
2930*b1cdbd2cSJim Jagielski
createCellStyle()2931*b1cdbd2cSJim Jagielski void CellStyle::createCellStyle()
2932*b1cdbd2cSJim Jagielski {
2933*b1cdbd2cSJim Jagielski // #i1624# #i1768# ignore unnamed user styles
2934*b1cdbd2cSJim Jagielski if( !mbCreated )
2935*b1cdbd2cSJim Jagielski mbCreated = maFinalName.getLength() == 0;
2936*b1cdbd2cSJim Jagielski
2937*b1cdbd2cSJim Jagielski /* #i103281# do not create another style of the same name, if it exists
2938*b1cdbd2cSJim Jagielski already. This is needed to prevent that styles pasted from clipboard
2939*b1cdbd2cSJim Jagielski get duplicated over and over. */
2940*b1cdbd2cSJim Jagielski if( !mbCreated ) try
2941*b1cdbd2cSJim Jagielski {
2942*b1cdbd2cSJim Jagielski Reference< XNameAccess > xCellStylesNA( getStyleFamily( false ), UNO_QUERY_THROW );
2943*b1cdbd2cSJim Jagielski mbCreated = xCellStylesNA->hasByName( maFinalName );
2944*b1cdbd2cSJim Jagielski }
2945*b1cdbd2cSJim Jagielski catch( Exception& )
2946*b1cdbd2cSJim Jagielski {
2947*b1cdbd2cSJim Jagielski }
2948*b1cdbd2cSJim Jagielski
2949*b1cdbd2cSJim Jagielski // create the style object in the document
2950*b1cdbd2cSJim Jagielski if( !mbCreated ) try
2951*b1cdbd2cSJim Jagielski {
2952*b1cdbd2cSJim Jagielski mbCreated = true;
2953*b1cdbd2cSJim Jagielski Reference< XStyle > xStyle( createStyleObject( maFinalName, false ), UNO_SET_THROW );
2954*b1cdbd2cSJim Jagielski // write style formatting properties
2955*b1cdbd2cSJim Jagielski PropertySet aPropSet( xStyle );
2956*b1cdbd2cSJim Jagielski getStyles().writeStyleXfToPropertySet( aPropSet, maModel.mnXfId );
2957*b1cdbd2cSJim Jagielski if( !maModel.isDefaultStyle() )
2958*b1cdbd2cSJim Jagielski xStyle->setParentStyle( getStyles().getDefaultStyleName() );
2959*b1cdbd2cSJim Jagielski }
2960*b1cdbd2cSJim Jagielski catch( Exception& )
2961*b1cdbd2cSJim Jagielski {
2962*b1cdbd2cSJim Jagielski }
2963*b1cdbd2cSJim Jagielski }
2964*b1cdbd2cSJim Jagielski
finalizeImport(const OUString & rFinalName)2965*b1cdbd2cSJim Jagielski void CellStyle::finalizeImport( const OUString& rFinalName )
2966*b1cdbd2cSJim Jagielski {
2967*b1cdbd2cSJim Jagielski maFinalName = rFinalName;
2968*b1cdbd2cSJim Jagielski if( !maModel.isBuiltin() || maModel.mbCustom )
2969*b1cdbd2cSJim Jagielski createCellStyle();
2970*b1cdbd2cSJim Jagielski }
2971*b1cdbd2cSJim Jagielski
2972*b1cdbd2cSJim Jagielski // ============================================================================
2973*b1cdbd2cSJim Jagielski
CellStyleBuffer(const WorkbookHelper & rHelper)2974*b1cdbd2cSJim Jagielski CellStyleBuffer::CellStyleBuffer( const WorkbookHelper& rHelper ) :
2975*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper )
2976*b1cdbd2cSJim Jagielski {
2977*b1cdbd2cSJim Jagielski }
2978*b1cdbd2cSJim Jagielski
importCellStyle(const AttributeList & rAttribs)2979*b1cdbd2cSJim Jagielski CellStyleRef CellStyleBuffer::importCellStyle( const AttributeList& rAttribs )
2980*b1cdbd2cSJim Jagielski {
2981*b1cdbd2cSJim Jagielski CellStyleRef xCellStyle( new CellStyle( *this ) );
2982*b1cdbd2cSJim Jagielski xCellStyle->importCellStyle( rAttribs );
2983*b1cdbd2cSJim Jagielski insertCellStyle( xCellStyle );
2984*b1cdbd2cSJim Jagielski return xCellStyle;
2985*b1cdbd2cSJim Jagielski }
2986*b1cdbd2cSJim Jagielski
importCellStyle(SequenceInputStream & rStrm)2987*b1cdbd2cSJim Jagielski CellStyleRef CellStyleBuffer::importCellStyle( SequenceInputStream& rStrm )
2988*b1cdbd2cSJim Jagielski {
2989*b1cdbd2cSJim Jagielski CellStyleRef xCellStyle( new CellStyle( *this ) );
2990*b1cdbd2cSJim Jagielski xCellStyle->importCellStyle( rStrm );
2991*b1cdbd2cSJim Jagielski insertCellStyle( xCellStyle );
2992*b1cdbd2cSJim Jagielski return xCellStyle;
2993*b1cdbd2cSJim Jagielski }
2994*b1cdbd2cSJim Jagielski
importStyle(BiffInputStream & rStrm)2995*b1cdbd2cSJim Jagielski CellStyleRef CellStyleBuffer::importStyle( BiffInputStream& rStrm )
2996*b1cdbd2cSJim Jagielski {
2997*b1cdbd2cSJim Jagielski CellStyleRef xCellStyle( new CellStyle( *this ) );
2998*b1cdbd2cSJim Jagielski xCellStyle->importStyle( rStrm );
2999*b1cdbd2cSJim Jagielski insertCellStyle( xCellStyle );
3000*b1cdbd2cSJim Jagielski return xCellStyle;
3001*b1cdbd2cSJim Jagielski }
3002*b1cdbd2cSJim Jagielski
finalizeImport()3003*b1cdbd2cSJim Jagielski void CellStyleBuffer::finalizeImport()
3004*b1cdbd2cSJim Jagielski {
3005*b1cdbd2cSJim Jagielski // calculate final names of all styles
3006*b1cdbd2cSJim Jagielski typedef RefMap< OUString, CellStyle, IgnoreCaseCompare > CellStyleNameMap;
3007*b1cdbd2cSJim Jagielski CellStyleNameMap aCellStyles;
3008*b1cdbd2cSJim Jagielski CellStyleVector aConflictNameStyles;
3009*b1cdbd2cSJim Jagielski
3010*b1cdbd2cSJim Jagielski /* First, reserve style names that are built-in in Calc. This causes that
3011*b1cdbd2cSJim Jagielski imported cell styles get different unused names and thus do not try to
3012*b1cdbd2cSJim Jagielski overwrite these built-in styles. For BIFF4 workbooks (which contain a
3013*b1cdbd2cSJim Jagielski separate list of cell styles per sheet), reserve all existing styles if
3014*b1cdbd2cSJim Jagielski current sheet is not the first sheet (this styles buffer will be
3015*b1cdbd2cSJim Jagielski constructed again for every new sheet). This will create unique names
3016*b1cdbd2cSJim Jagielski for styles in different sheets with the same name. Assuming that the
3017*b1cdbd2cSJim Jagielski BIFF4W import filter is never used to import from clipboard... */
3018*b1cdbd2cSJim Jagielski bool bReserveAll = (getFilterType() == FILTER_BIFF) && (getBiff() == BIFF4) && isWorkbookFile() && (getCurrentSheetIndex() > 0);
3019*b1cdbd2cSJim Jagielski try
3020*b1cdbd2cSJim Jagielski {
3021*b1cdbd2cSJim Jagielski // unfortunately, com.sun.star.style.StyleFamily does not implement XEnumerationAccess...
3022*b1cdbd2cSJim Jagielski Reference< XIndexAccess > xStyleFamilyIA( getStyleFamily( false ), UNO_QUERY_THROW );
3023*b1cdbd2cSJim Jagielski for( sal_Int32 nIndex = 0, nCount = xStyleFamilyIA->getCount(); nIndex < nCount; ++nIndex )
3024*b1cdbd2cSJim Jagielski {
3025*b1cdbd2cSJim Jagielski Reference< XStyle > xStyle( xStyleFamilyIA->getByIndex( nIndex ), UNO_QUERY_THROW );
3026*b1cdbd2cSJim Jagielski if( bReserveAll || !xStyle->isUserDefined() )
3027*b1cdbd2cSJim Jagielski {
3028*b1cdbd2cSJim Jagielski Reference< XNamed > xStyleName( xStyle, UNO_QUERY_THROW );
3029*b1cdbd2cSJim Jagielski // create an empty entry by using ::std::map<>::operator[]
3030*b1cdbd2cSJim Jagielski aCellStyles[ xStyleName->getName() ];
3031*b1cdbd2cSJim Jagielski }
3032*b1cdbd2cSJim Jagielski }
3033*b1cdbd2cSJim Jagielski }
3034*b1cdbd2cSJim Jagielski catch( Exception& )
3035*b1cdbd2cSJim Jagielski {
3036*b1cdbd2cSJim Jagielski }
3037*b1cdbd2cSJim Jagielski
3038*b1cdbd2cSJim Jagielski /* Calculate names of built-in styles. Store styles with reserved names
3039*b1cdbd2cSJim Jagielski in the aConflictNameStyles list. */
3040*b1cdbd2cSJim Jagielski for( CellStyleVector::iterator aIt = maBuiltinStyles.begin(), aEnd = maBuiltinStyles.end(); aIt != aEnd; ++aIt )
3041*b1cdbd2cSJim Jagielski {
3042*b1cdbd2cSJim Jagielski const CellStyleModel& rModel = (*aIt)->getModel();
3043*b1cdbd2cSJim Jagielski OUString aStyleName = lclCreateStyleName( rModel );
3044*b1cdbd2cSJim Jagielski /* If a builtin style entry already exists, and we do not reserve all
3045*b1cdbd2cSJim Jagielski existing styles, we just stick with the last definition and ignore
3046*b1cdbd2cSJim Jagielski the preceding ones. */
3047*b1cdbd2cSJim Jagielski if( bReserveAll && (aCellStyles.count( aStyleName ) > 0) )
3048*b1cdbd2cSJim Jagielski aConflictNameStyles.push_back( *aIt );
3049*b1cdbd2cSJim Jagielski else
3050*b1cdbd2cSJim Jagielski aCellStyles[ aStyleName ] = *aIt;
3051*b1cdbd2cSJim Jagielski }
3052*b1cdbd2cSJim Jagielski
3053*b1cdbd2cSJim Jagielski /* Calculate names of user defined styles. Store styles with reserved
3054*b1cdbd2cSJim Jagielski names in the aConflictNameStyles list. */
3055*b1cdbd2cSJim Jagielski for( CellStyleVector::iterator aIt = maUserStyles.begin(), aEnd = maUserStyles.end(); aIt != aEnd; ++aIt )
3056*b1cdbd2cSJim Jagielski {
3057*b1cdbd2cSJim Jagielski const CellStyleModel& rModel = (*aIt)->getModel();
3058*b1cdbd2cSJim Jagielski OUString aStyleName = lclCreateStyleName( rModel );
3059*b1cdbd2cSJim Jagielski // #i1624# #i1768# ignore unnamed user styles
3060*b1cdbd2cSJim Jagielski if( aStyleName.getLength() > 0 )
3061*b1cdbd2cSJim Jagielski {
3062*b1cdbd2cSJim Jagielski if( aCellStyles.count( aStyleName ) > 0 )
3063*b1cdbd2cSJim Jagielski aConflictNameStyles.push_back( *aIt );
3064*b1cdbd2cSJim Jagielski else
3065*b1cdbd2cSJim Jagielski aCellStyles[ aStyleName ] = *aIt;
3066*b1cdbd2cSJim Jagielski }
3067*b1cdbd2cSJim Jagielski }
3068*b1cdbd2cSJim Jagielski
3069*b1cdbd2cSJim Jagielski // find unused names for all styles with conflicting names
3070*b1cdbd2cSJim Jagielski for( CellStyleVector::iterator aIt = aConflictNameStyles.begin(), aEnd = aConflictNameStyles.end(); aIt != aEnd; ++aIt )
3071*b1cdbd2cSJim Jagielski {
3072*b1cdbd2cSJim Jagielski const CellStyleModel& rModel = (*aIt)->getModel();
3073*b1cdbd2cSJim Jagielski OUString aStyleName = lclCreateStyleName( rModel );
3074*b1cdbd2cSJim Jagielski OUString aUnusedName;
3075*b1cdbd2cSJim Jagielski sal_Int32 nIndex = 0;
3076*b1cdbd2cSJim Jagielski do
3077*b1cdbd2cSJim Jagielski {
3078*b1cdbd2cSJim Jagielski aUnusedName = OUStringBuffer( aStyleName ).append( sal_Unicode( ' ' ) ).append( ++nIndex ).makeStringAndClear();
3079*b1cdbd2cSJim Jagielski }
3080*b1cdbd2cSJim Jagielski while( aCellStyles.count( aUnusedName ) > 0 );
3081*b1cdbd2cSJim Jagielski aCellStyles[ aUnusedName ] = *aIt;
3082*b1cdbd2cSJim Jagielski }
3083*b1cdbd2cSJim Jagielski
3084*b1cdbd2cSJim Jagielski // set final names and create user-defined and modified built-in cell styles
3085*b1cdbd2cSJim Jagielski aCellStyles.forEachMemWithKey( &CellStyle::finalizeImport );
3086*b1cdbd2cSJim Jagielski }
3087*b1cdbd2cSJim Jagielski
getDefaultXfId() const3088*b1cdbd2cSJim Jagielski sal_Int32 CellStyleBuffer::getDefaultXfId() const
3089*b1cdbd2cSJim Jagielski {
3090*b1cdbd2cSJim Jagielski return mxDefStyle.get() ? mxDefStyle->getModel().mnXfId : -1;
3091*b1cdbd2cSJim Jagielski }
3092*b1cdbd2cSJim Jagielski
getDefaultStyleName() const3093*b1cdbd2cSJim Jagielski OUString CellStyleBuffer::getDefaultStyleName() const
3094*b1cdbd2cSJim Jagielski {
3095*b1cdbd2cSJim Jagielski return createCellStyle( mxDefStyle );
3096*b1cdbd2cSJim Jagielski }
3097*b1cdbd2cSJim Jagielski
createCellStyle(sal_Int32 nXfId) const3098*b1cdbd2cSJim Jagielski OUString CellStyleBuffer::createCellStyle( sal_Int32 nXfId ) const
3099*b1cdbd2cSJim Jagielski {
3100*b1cdbd2cSJim Jagielski return createCellStyle( maStylesByXf.get( nXfId ) );
3101*b1cdbd2cSJim Jagielski }
3102*b1cdbd2cSJim Jagielski
3103*b1cdbd2cSJim Jagielski // private --------------------------------------------------------------------
3104*b1cdbd2cSJim Jagielski
insertCellStyle(CellStyleRef xCellStyle)3105*b1cdbd2cSJim Jagielski void CellStyleBuffer::insertCellStyle( CellStyleRef xCellStyle )
3106*b1cdbd2cSJim Jagielski {
3107*b1cdbd2cSJim Jagielski const CellStyleModel& rModel = xCellStyle->getModel();
3108*b1cdbd2cSJim Jagielski if( rModel.mnXfId >= 0 )
3109*b1cdbd2cSJim Jagielski {
3110*b1cdbd2cSJim Jagielski // insert into the built-in map or user defined map
3111*b1cdbd2cSJim Jagielski (rModel.isBuiltin() ? maBuiltinStyles : maUserStyles).push_back( xCellStyle );
3112*b1cdbd2cSJim Jagielski
3113*b1cdbd2cSJim Jagielski // insert into the XF identifier map
3114*b1cdbd2cSJim Jagielski OSL_ENSURE( maStylesByXf.count( rModel.mnXfId ) == 0, "CellStyleBuffer::insertCellStyle - multiple styles with equal XF identifier" );
3115*b1cdbd2cSJim Jagielski maStylesByXf[ rModel.mnXfId ] = xCellStyle;
3116*b1cdbd2cSJim Jagielski
3117*b1cdbd2cSJim Jagielski // remember default cell style
3118*b1cdbd2cSJim Jagielski if( rModel.isDefaultStyle() )
3119*b1cdbd2cSJim Jagielski mxDefStyle = xCellStyle;
3120*b1cdbd2cSJim Jagielski }
3121*b1cdbd2cSJim Jagielski }
3122*b1cdbd2cSJim Jagielski
createCellStyle(const CellStyleRef & rxCellStyle) const3123*b1cdbd2cSJim Jagielski OUString CellStyleBuffer::createCellStyle( const CellStyleRef& rxCellStyle ) const
3124*b1cdbd2cSJim Jagielski {
3125*b1cdbd2cSJim Jagielski if( rxCellStyle.get() )
3126*b1cdbd2cSJim Jagielski {
3127*b1cdbd2cSJim Jagielski rxCellStyle->createCellStyle();
3128*b1cdbd2cSJim Jagielski const OUString& rStyleName = rxCellStyle->getFinalStyleName();
3129*b1cdbd2cSJim Jagielski if( rStyleName.getLength() > 0 )
3130*b1cdbd2cSJim Jagielski return rStyleName;
3131*b1cdbd2cSJim Jagielski }
3132*b1cdbd2cSJim Jagielski // on error: fallback to default style
3133*b1cdbd2cSJim Jagielski return lclGetBuiltinStyleName( OOX_STYLE_NORMAL, OUString() );
3134*b1cdbd2cSJim Jagielski }
3135*b1cdbd2cSJim Jagielski
3136*b1cdbd2cSJim Jagielski // ============================================================================
3137*b1cdbd2cSJim Jagielski
AutoFormatModel()3138*b1cdbd2cSJim Jagielski AutoFormatModel::AutoFormatModel() :
3139*b1cdbd2cSJim Jagielski mnAutoFormatId( 0 ),
3140*b1cdbd2cSJim Jagielski mbApplyNumFmt( false ),
3141*b1cdbd2cSJim Jagielski mbApplyFont( false ),
3142*b1cdbd2cSJim Jagielski mbApplyAlignment( false ),
3143*b1cdbd2cSJim Jagielski mbApplyBorder( false ),
3144*b1cdbd2cSJim Jagielski mbApplyFill( false ),
3145*b1cdbd2cSJim Jagielski mbApplyProtection( false )
3146*b1cdbd2cSJim Jagielski {
3147*b1cdbd2cSJim Jagielski }
3148*b1cdbd2cSJim Jagielski
3149*b1cdbd2cSJim Jagielski // ============================================================================
3150*b1cdbd2cSJim Jagielski
StylesBuffer(const WorkbookHelper & rHelper)3151*b1cdbd2cSJim Jagielski StylesBuffer::StylesBuffer( const WorkbookHelper& rHelper ) :
3152*b1cdbd2cSJim Jagielski WorkbookHelper( rHelper ),
3153*b1cdbd2cSJim Jagielski maPalette( rHelper ),
3154*b1cdbd2cSJim Jagielski maNumFmts( rHelper ),
3155*b1cdbd2cSJim Jagielski maCellStyles( rHelper )
3156*b1cdbd2cSJim Jagielski {
3157*b1cdbd2cSJim Jagielski }
3158*b1cdbd2cSJim Jagielski
createFont(sal_Int32 * opnFontId)3159*b1cdbd2cSJim Jagielski FontRef StylesBuffer::createFont( sal_Int32* opnFontId )
3160*b1cdbd2cSJim Jagielski {
3161*b1cdbd2cSJim Jagielski if( opnFontId ) *opnFontId = static_cast< sal_Int32 >( maFonts.size() );
3162*b1cdbd2cSJim Jagielski FontRef xFont( new Font( *this, false ) );
3163*b1cdbd2cSJim Jagielski maFonts.push_back( xFont );
3164*b1cdbd2cSJim Jagielski return xFont;
3165*b1cdbd2cSJim Jagielski }
3166*b1cdbd2cSJim Jagielski
createNumFmt(sal_Int32 nNumFmtId,const OUString & rFmtCode)3167*b1cdbd2cSJim Jagielski NumberFormatRef StylesBuffer::createNumFmt( sal_Int32 nNumFmtId, const OUString& rFmtCode )
3168*b1cdbd2cSJim Jagielski {
3169*b1cdbd2cSJim Jagielski return maNumFmts.createNumFmt( nNumFmtId, rFmtCode );
3170*b1cdbd2cSJim Jagielski }
3171*b1cdbd2cSJim Jagielski
createBorder(sal_Int32 * opnBorderId)3172*b1cdbd2cSJim Jagielski BorderRef StylesBuffer::createBorder( sal_Int32* opnBorderId )
3173*b1cdbd2cSJim Jagielski {
3174*b1cdbd2cSJim Jagielski if( opnBorderId ) *opnBorderId = static_cast< sal_Int32 >( maBorders.size() );
3175*b1cdbd2cSJim Jagielski BorderRef xBorder( new Border( *this, false ) );
3176*b1cdbd2cSJim Jagielski maBorders.push_back( xBorder );
3177*b1cdbd2cSJim Jagielski return xBorder;
3178*b1cdbd2cSJim Jagielski }
3179*b1cdbd2cSJim Jagielski
createFill(sal_Int32 * opnFillId)3180*b1cdbd2cSJim Jagielski FillRef StylesBuffer::createFill( sal_Int32* opnFillId )
3181*b1cdbd2cSJim Jagielski {
3182*b1cdbd2cSJim Jagielski if( opnFillId ) *opnFillId = static_cast< sal_Int32 >( maFills.size() );
3183*b1cdbd2cSJim Jagielski FillRef xFill( new Fill( *this, false ) );
3184*b1cdbd2cSJim Jagielski maFills.push_back( xFill );
3185*b1cdbd2cSJim Jagielski return xFill;
3186*b1cdbd2cSJim Jagielski }
3187*b1cdbd2cSJim Jagielski
createCellXf(sal_Int32 * opnXfId)3188*b1cdbd2cSJim Jagielski XfRef StylesBuffer::createCellXf( sal_Int32* opnXfId )
3189*b1cdbd2cSJim Jagielski {
3190*b1cdbd2cSJim Jagielski if( opnXfId ) *opnXfId = static_cast< sal_Int32 >( maCellXfs.size() );
3191*b1cdbd2cSJim Jagielski XfRef xXf( new Xf( *this ) );
3192*b1cdbd2cSJim Jagielski maCellXfs.push_back( xXf );
3193*b1cdbd2cSJim Jagielski return xXf;
3194*b1cdbd2cSJim Jagielski }
3195*b1cdbd2cSJim Jagielski
createStyleXf(sal_Int32 * opnXfId)3196*b1cdbd2cSJim Jagielski XfRef StylesBuffer::createStyleXf( sal_Int32* opnXfId )
3197*b1cdbd2cSJim Jagielski {
3198*b1cdbd2cSJim Jagielski if( opnXfId ) *opnXfId = static_cast< sal_Int32 >( maStyleXfs.size() );
3199*b1cdbd2cSJim Jagielski XfRef xXf( new Xf( *this ) );
3200*b1cdbd2cSJim Jagielski maStyleXfs.push_back( xXf );
3201*b1cdbd2cSJim Jagielski return xXf;
3202*b1cdbd2cSJim Jagielski }
3203*b1cdbd2cSJim Jagielski
createDxf(sal_Int32 * opnDxfId)3204*b1cdbd2cSJim Jagielski DxfRef StylesBuffer::createDxf( sal_Int32* opnDxfId )
3205*b1cdbd2cSJim Jagielski {
3206*b1cdbd2cSJim Jagielski if( opnDxfId ) *opnDxfId = static_cast< sal_Int32 >( maDxfs.size() );
3207*b1cdbd2cSJim Jagielski DxfRef xDxf( new Dxf( *this ) );
3208*b1cdbd2cSJim Jagielski maDxfs.push_back( xDxf );
3209*b1cdbd2cSJim Jagielski return xDxf;
3210*b1cdbd2cSJim Jagielski }
3211*b1cdbd2cSJim Jagielski
importPaletteColor(const AttributeList & rAttribs)3212*b1cdbd2cSJim Jagielski void StylesBuffer::importPaletteColor( const AttributeList& rAttribs )
3213*b1cdbd2cSJim Jagielski {
3214*b1cdbd2cSJim Jagielski maPalette.importPaletteColor( rAttribs );
3215*b1cdbd2cSJim Jagielski }
3216*b1cdbd2cSJim Jagielski
importNumFmt(const AttributeList & rAttribs)3217*b1cdbd2cSJim Jagielski NumberFormatRef StylesBuffer::importNumFmt( const AttributeList& rAttribs )
3218*b1cdbd2cSJim Jagielski {
3219*b1cdbd2cSJim Jagielski return maNumFmts.importNumFmt( rAttribs );
3220*b1cdbd2cSJim Jagielski }
3221*b1cdbd2cSJim Jagielski
importCellStyle(const AttributeList & rAttribs)3222*b1cdbd2cSJim Jagielski CellStyleRef StylesBuffer::importCellStyle( const AttributeList& rAttribs )
3223*b1cdbd2cSJim Jagielski {
3224*b1cdbd2cSJim Jagielski return maCellStyles.importCellStyle( rAttribs );
3225*b1cdbd2cSJim Jagielski }
3226*b1cdbd2cSJim Jagielski
importPaletteColor(SequenceInputStream & rStrm)3227*b1cdbd2cSJim Jagielski void StylesBuffer::importPaletteColor( SequenceInputStream& rStrm )
3228*b1cdbd2cSJim Jagielski {
3229*b1cdbd2cSJim Jagielski maPalette.importPaletteColor( rStrm );
3230*b1cdbd2cSJim Jagielski }
3231*b1cdbd2cSJim Jagielski
importNumFmt(SequenceInputStream & rStrm)3232*b1cdbd2cSJim Jagielski void StylesBuffer::importNumFmt( SequenceInputStream& rStrm )
3233*b1cdbd2cSJim Jagielski {
3234*b1cdbd2cSJim Jagielski maNumFmts.importNumFmt( rStrm );
3235*b1cdbd2cSJim Jagielski }
3236*b1cdbd2cSJim Jagielski
importCellStyle(SequenceInputStream & rStrm)3237*b1cdbd2cSJim Jagielski void StylesBuffer::importCellStyle( SequenceInputStream& rStrm )
3238*b1cdbd2cSJim Jagielski {
3239*b1cdbd2cSJim Jagielski maCellStyles.importCellStyle( rStrm );
3240*b1cdbd2cSJim Jagielski }
3241*b1cdbd2cSJim Jagielski
importPalette(BiffInputStream & rStrm)3242*b1cdbd2cSJim Jagielski void StylesBuffer::importPalette( BiffInputStream& rStrm )
3243*b1cdbd2cSJim Jagielski {
3244*b1cdbd2cSJim Jagielski maPalette.importPalette( rStrm );
3245*b1cdbd2cSJim Jagielski }
3246*b1cdbd2cSJim Jagielski
importFont(BiffInputStream & rStrm)3247*b1cdbd2cSJim Jagielski void StylesBuffer::importFont( BiffInputStream& rStrm )
3248*b1cdbd2cSJim Jagielski {
3249*b1cdbd2cSJim Jagielski /* Font with index 4 is not stored in BIFF. This means effectively, first
3250*b1cdbd2cSJim Jagielski font in the BIFF file has index 0, fourth font has index 3, and fifth
3251*b1cdbd2cSJim Jagielski font has index 5. Insert a dummy font to correctly map passed font
3252*b1cdbd2cSJim Jagielski identifiers. */
3253*b1cdbd2cSJim Jagielski if( maFonts.size() == 4 )
3254*b1cdbd2cSJim Jagielski maFonts.push_back( maFonts.front() );
3255*b1cdbd2cSJim Jagielski
3256*b1cdbd2cSJim Jagielski FontRef xFont = createFont();
3257*b1cdbd2cSJim Jagielski xFont->importFont( rStrm );
3258*b1cdbd2cSJim Jagielski
3259*b1cdbd2cSJim Jagielski /* #i71033# Set stream text encoding from application font, if CODEPAGE
3260*b1cdbd2cSJim Jagielski record is missing. Must be done now (not while finalizeImport() runs),
3261*b1cdbd2cSJim Jagielski to be able to read all following byte strings correctly (e.g. cell
3262*b1cdbd2cSJim Jagielski style names). */
3263*b1cdbd2cSJim Jagielski if( maFonts.size() == 1 )
3264*b1cdbd2cSJim Jagielski setAppFontEncoding( xFont->getFontEncoding() );
3265*b1cdbd2cSJim Jagielski }
3266*b1cdbd2cSJim Jagielski
importFontColor(BiffInputStream & rStrm)3267*b1cdbd2cSJim Jagielski void StylesBuffer::importFontColor( BiffInputStream& rStrm )
3268*b1cdbd2cSJim Jagielski {
3269*b1cdbd2cSJim Jagielski if( !maFonts.empty() )
3270*b1cdbd2cSJim Jagielski maFonts.back()->importFontColor( rStrm );
3271*b1cdbd2cSJim Jagielski }
3272*b1cdbd2cSJim Jagielski
importFormat(BiffInputStream & rStrm)3273*b1cdbd2cSJim Jagielski void StylesBuffer::importFormat( BiffInputStream& rStrm )
3274*b1cdbd2cSJim Jagielski {
3275*b1cdbd2cSJim Jagielski maNumFmts.importFormat( rStrm );
3276*b1cdbd2cSJim Jagielski }
3277*b1cdbd2cSJim Jagielski
importXf(BiffInputStream & rStrm)3278*b1cdbd2cSJim Jagielski void StylesBuffer::importXf( BiffInputStream& rStrm )
3279*b1cdbd2cSJim Jagielski {
3280*b1cdbd2cSJim Jagielski XfRef xXf( new Xf( *this ) );
3281*b1cdbd2cSJim Jagielski xXf->importXf( rStrm );
3282*b1cdbd2cSJim Jagielski
3283*b1cdbd2cSJim Jagielski XfRef xCellXf, xStyleXf;
3284*b1cdbd2cSJim Jagielski (xXf->isCellXf() ? xCellXf : xStyleXf) = xXf;
3285*b1cdbd2cSJim Jagielski maCellXfs.push_back( xCellXf );
3286*b1cdbd2cSJim Jagielski maStyleXfs.push_back( xStyleXf );
3287*b1cdbd2cSJim Jagielski }
3288*b1cdbd2cSJim Jagielski
importStyle(BiffInputStream & rStrm)3289*b1cdbd2cSJim Jagielski void StylesBuffer::importStyle( BiffInputStream& rStrm )
3290*b1cdbd2cSJim Jagielski {
3291*b1cdbd2cSJim Jagielski maCellStyles.importStyle( rStrm );
3292*b1cdbd2cSJim Jagielski }
3293*b1cdbd2cSJim Jagielski
importPalette(const Any & rPalette)3294*b1cdbd2cSJim Jagielski void StylesBuffer::importPalette( const Any& rPalette )
3295*b1cdbd2cSJim Jagielski {
3296*b1cdbd2cSJim Jagielski maPalette.importPalette( rPalette );
3297*b1cdbd2cSJim Jagielski }
3298*b1cdbd2cSJim Jagielski
finalizeImport()3299*b1cdbd2cSJim Jagielski void StylesBuffer::finalizeImport()
3300*b1cdbd2cSJim Jagielski {
3301*b1cdbd2cSJim Jagielski // fonts first, are needed to finalize unit converter and XFs below
3302*b1cdbd2cSJim Jagielski maFonts.forEachMem( &Font::finalizeImport );
3303*b1cdbd2cSJim Jagielski // finalize unit coefficients after default font is known
3304*b1cdbd2cSJim Jagielski getUnitConverter().finalizeImport();
3305*b1cdbd2cSJim Jagielski // number formats
3306*b1cdbd2cSJim Jagielski maNumFmts.finalizeImport();
3307*b1cdbd2cSJim Jagielski // borders and fills
3308*b1cdbd2cSJim Jagielski maBorders.forEachMem( &Border::finalizeImport );
3309*b1cdbd2cSJim Jagielski maFills.forEachMem( &Fill::finalizeImport );
3310*b1cdbd2cSJim Jagielski // style XFs and cell XFs
3311*b1cdbd2cSJim Jagielski maStyleXfs.forEachMem( &Xf::finalizeImport );
3312*b1cdbd2cSJim Jagielski maCellXfs.forEachMem( &Xf::finalizeImport );
3313*b1cdbd2cSJim Jagielski // built-in and user defined cell styles
3314*b1cdbd2cSJim Jagielski maCellStyles.finalizeImport();
3315*b1cdbd2cSJim Jagielski // differential formatting (for conditional formatting)
3316*b1cdbd2cSJim Jagielski maDxfs.forEachMem( &Dxf::finalizeImport );
3317*b1cdbd2cSJim Jagielski }
3318*b1cdbd2cSJim Jagielski
getPaletteColor(sal_Int32 nPaletteIdx) const3319*b1cdbd2cSJim Jagielski sal_Int32 StylesBuffer::getPaletteColor( sal_Int32 nPaletteIdx ) const
3320*b1cdbd2cSJim Jagielski {
3321*b1cdbd2cSJim Jagielski return maPalette.getColor( nPaletteIdx );
3322*b1cdbd2cSJim Jagielski }
3323*b1cdbd2cSJim Jagielski
getFont(sal_Int32 nFontId) const3324*b1cdbd2cSJim Jagielski FontRef StylesBuffer::getFont( sal_Int32 nFontId ) const
3325*b1cdbd2cSJim Jagielski {
3326*b1cdbd2cSJim Jagielski return maFonts.get( nFontId );
3327*b1cdbd2cSJim Jagielski }
3328*b1cdbd2cSJim Jagielski
getBorder(sal_Int32 nBorderId) const3329*b1cdbd2cSJim Jagielski BorderRef StylesBuffer::getBorder( sal_Int32 nBorderId ) const
3330*b1cdbd2cSJim Jagielski {
3331*b1cdbd2cSJim Jagielski return maBorders.get( nBorderId );
3332*b1cdbd2cSJim Jagielski }
3333*b1cdbd2cSJim Jagielski
getCellXf(sal_Int32 nXfId) const3334*b1cdbd2cSJim Jagielski XfRef StylesBuffer::getCellXf( sal_Int32 nXfId ) const
3335*b1cdbd2cSJim Jagielski {
3336*b1cdbd2cSJim Jagielski return maCellXfs.get( nXfId );
3337*b1cdbd2cSJim Jagielski }
3338*b1cdbd2cSJim Jagielski
getStyleXf(sal_Int32 nXfId) const3339*b1cdbd2cSJim Jagielski XfRef StylesBuffer::getStyleXf( sal_Int32 nXfId ) const
3340*b1cdbd2cSJim Jagielski {
3341*b1cdbd2cSJim Jagielski return maStyleXfs.get( nXfId );
3342*b1cdbd2cSJim Jagielski }
3343*b1cdbd2cSJim Jagielski
getDxf(sal_Int32 nDxfId) const3344*b1cdbd2cSJim Jagielski DxfRef StylesBuffer::getDxf( sal_Int32 nDxfId ) const
3345*b1cdbd2cSJim Jagielski {
3346*b1cdbd2cSJim Jagielski return maDxfs.get( nDxfId );
3347*b1cdbd2cSJim Jagielski }
3348*b1cdbd2cSJim Jagielski
getFontFromCellXf(sal_Int32 nXfId) const3349*b1cdbd2cSJim Jagielski FontRef StylesBuffer::getFontFromCellXf( sal_Int32 nXfId ) const
3350*b1cdbd2cSJim Jagielski {
3351*b1cdbd2cSJim Jagielski FontRef xFont;
3352*b1cdbd2cSJim Jagielski if( const Xf* pXf = getCellXf( nXfId ).get() )
3353*b1cdbd2cSJim Jagielski xFont = pXf->getFont();
3354*b1cdbd2cSJim Jagielski return xFont;
3355*b1cdbd2cSJim Jagielski }
3356*b1cdbd2cSJim Jagielski
getDefaultFont() const3357*b1cdbd2cSJim Jagielski FontRef StylesBuffer::getDefaultFont() const
3358*b1cdbd2cSJim Jagielski {
3359*b1cdbd2cSJim Jagielski FontRef xDefFont;
3360*b1cdbd2cSJim Jagielski if( const Xf* pXf = getStyleXf( maCellStyles.getDefaultXfId() ).get() )
3361*b1cdbd2cSJim Jagielski xDefFont = pXf->getFont();
3362*b1cdbd2cSJim Jagielski // no font from styles - try first loaded font (e.g. BIFF2)
3363*b1cdbd2cSJim Jagielski if( !xDefFont )
3364*b1cdbd2cSJim Jagielski xDefFont = maFonts.get( 0 );
3365*b1cdbd2cSJim Jagielski OSL_ENSURE( xDefFont.get(), "StylesBuffer::getDefaultFont - no default font found" );
3366*b1cdbd2cSJim Jagielski return xDefFont;
3367*b1cdbd2cSJim Jagielski }
3368*b1cdbd2cSJim Jagielski
getDefaultFontModel() const3369*b1cdbd2cSJim Jagielski const FontModel& StylesBuffer::getDefaultFontModel() const
3370*b1cdbd2cSJim Jagielski {
3371*b1cdbd2cSJim Jagielski FontRef xDefFont = getDefaultFont();
3372*b1cdbd2cSJim Jagielski return xDefFont.get() ? xDefFont->getModel() : getTheme().getDefaultFontModel();
3373*b1cdbd2cSJim Jagielski }
3374*b1cdbd2cSJim Jagielski
equalBorders(sal_Int32 nBorderId1,sal_Int32 nBorderId2) const3375*b1cdbd2cSJim Jagielski bool StylesBuffer::equalBorders( sal_Int32 nBorderId1, sal_Int32 nBorderId2 ) const
3376*b1cdbd2cSJim Jagielski {
3377*b1cdbd2cSJim Jagielski if( nBorderId1 == nBorderId2 )
3378*b1cdbd2cSJim Jagielski return true;
3379*b1cdbd2cSJim Jagielski
3380*b1cdbd2cSJim Jagielski switch( getFilterType() )
3381*b1cdbd2cSJim Jagielski {
3382*b1cdbd2cSJim Jagielski case FILTER_OOXML:
3383*b1cdbd2cSJim Jagielski // in OOXML, borders are assumed to be unique
3384*b1cdbd2cSJim Jagielski return false;
3385*b1cdbd2cSJim Jagielski
3386*b1cdbd2cSJim Jagielski case FILTER_BIFF:
3387*b1cdbd2cSJim Jagielski {
3388*b1cdbd2cSJim Jagielski // in BIFF, a new border entry has been created for every XF
3389*b1cdbd2cSJim Jagielski const Border* pBorder1 = maBorders.get( nBorderId1 ).get();
3390*b1cdbd2cSJim Jagielski const Border* pBorder2 = maBorders.get( nBorderId2 ).get();
3391*b1cdbd2cSJim Jagielski return pBorder1 && pBorder2 && (pBorder1->getApiData() == pBorder2->getApiData());
3392*b1cdbd2cSJim Jagielski }
3393*b1cdbd2cSJim Jagielski
3394*b1cdbd2cSJim Jagielski case FILTER_UNKNOWN:
3395*b1cdbd2cSJim Jagielski break;
3396*b1cdbd2cSJim Jagielski }
3397*b1cdbd2cSJim Jagielski return false;
3398*b1cdbd2cSJim Jagielski }
3399*b1cdbd2cSJim Jagielski
equalFills(sal_Int32 nFillId1,sal_Int32 nFillId2) const3400*b1cdbd2cSJim Jagielski bool StylesBuffer::equalFills( sal_Int32 nFillId1, sal_Int32 nFillId2 ) const
3401*b1cdbd2cSJim Jagielski {
3402*b1cdbd2cSJim Jagielski if( nFillId1 == nFillId2 )
3403*b1cdbd2cSJim Jagielski return true;
3404*b1cdbd2cSJim Jagielski
3405*b1cdbd2cSJim Jagielski switch( getFilterType() )
3406*b1cdbd2cSJim Jagielski {
3407*b1cdbd2cSJim Jagielski case FILTER_OOXML:
3408*b1cdbd2cSJim Jagielski // in OOXML, fills are assumed to be unique
3409*b1cdbd2cSJim Jagielski return false;
3410*b1cdbd2cSJim Jagielski
3411*b1cdbd2cSJim Jagielski case FILTER_BIFF:
3412*b1cdbd2cSJim Jagielski {
3413*b1cdbd2cSJim Jagielski // in BIFF, a new fill entry has been created for every XF
3414*b1cdbd2cSJim Jagielski const Fill* pFill1 = maFills.get( nFillId1 ).get();
3415*b1cdbd2cSJim Jagielski const Fill* pFill2 = maFills.get( nFillId2 ).get();
3416*b1cdbd2cSJim Jagielski return pFill1 && pFill2 && (pFill1->getApiData() == pFill2->getApiData());
3417*b1cdbd2cSJim Jagielski }
3418*b1cdbd2cSJim Jagielski
3419*b1cdbd2cSJim Jagielski case FILTER_UNKNOWN:
3420*b1cdbd2cSJim Jagielski break;
3421*b1cdbd2cSJim Jagielski }
3422*b1cdbd2cSJim Jagielski return false;
3423*b1cdbd2cSJim Jagielski }
3424*b1cdbd2cSJim Jagielski
getDefaultStyleName() const3425*b1cdbd2cSJim Jagielski OUString StylesBuffer::getDefaultStyleName() const
3426*b1cdbd2cSJim Jagielski {
3427*b1cdbd2cSJim Jagielski return maCellStyles.getDefaultStyleName();
3428*b1cdbd2cSJim Jagielski }
3429*b1cdbd2cSJim Jagielski
createCellStyle(sal_Int32 nXfId) const3430*b1cdbd2cSJim Jagielski OUString StylesBuffer::createCellStyle( sal_Int32 nXfId ) const
3431*b1cdbd2cSJim Jagielski {
3432*b1cdbd2cSJim Jagielski return maCellStyles.createCellStyle( nXfId );
3433*b1cdbd2cSJim Jagielski }
3434*b1cdbd2cSJim Jagielski
createDxfStyle(sal_Int32 nDxfId) const3435*b1cdbd2cSJim Jagielski OUString StylesBuffer::createDxfStyle( sal_Int32 nDxfId ) const
3436*b1cdbd2cSJim Jagielski {
3437*b1cdbd2cSJim Jagielski OUString& rStyleName = maDxfStyles[ nDxfId ];
3438*b1cdbd2cSJim Jagielski if( rStyleName.getLength() == 0 )
3439*b1cdbd2cSJim Jagielski {
3440*b1cdbd2cSJim Jagielski if( Dxf* pDxf = maDxfs.get( nDxfId ).get() )
3441*b1cdbd2cSJim Jagielski {
3442*b1cdbd2cSJim Jagielski rStyleName = OUStringBuffer( CREATE_OUSTRING( "ConditionalStyle_" ) ).append( nDxfId + 1 ).makeStringAndClear();
3443*b1cdbd2cSJim Jagielski // create the style sheet (this may change rStyleName if such a style already exists)
3444*b1cdbd2cSJim Jagielski Reference< XStyle > xStyle = createStyleObject( rStyleName, false );
3445*b1cdbd2cSJim Jagielski // write style formatting properties
3446*b1cdbd2cSJim Jagielski PropertySet aPropSet( xStyle );
3447*b1cdbd2cSJim Jagielski pDxf->writeToPropertySet( aPropSet );
3448*b1cdbd2cSJim Jagielski }
3449*b1cdbd2cSJim Jagielski // on error: fallback to default style
3450*b1cdbd2cSJim Jagielski if( rStyleName.getLength() == 0 )
3451*b1cdbd2cSJim Jagielski rStyleName = maCellStyles.getDefaultStyleName();
3452*b1cdbd2cSJim Jagielski }
3453*b1cdbd2cSJim Jagielski return rStyleName;
3454*b1cdbd2cSJim Jagielski }
3455*b1cdbd2cSJim Jagielski
writeFontToPropertyMap(PropertyMap & rPropMap,sal_Int32 nFontId) const3456*b1cdbd2cSJim Jagielski void StylesBuffer::writeFontToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFontId ) const
3457*b1cdbd2cSJim Jagielski {
3458*b1cdbd2cSJim Jagielski if( Font* pFont = maFonts.get( nFontId ).get() )
3459*b1cdbd2cSJim Jagielski pFont->writeToPropertyMap( rPropMap, FONT_PROPTYPE_CELL );
3460*b1cdbd2cSJim Jagielski }
3461*b1cdbd2cSJim Jagielski
writeNumFmtToPropertyMap(PropertyMap & rPropMap,sal_Int32 nNumFmtId) const3462*b1cdbd2cSJim Jagielski void StylesBuffer::writeNumFmtToPropertyMap( PropertyMap& rPropMap, sal_Int32 nNumFmtId ) const
3463*b1cdbd2cSJim Jagielski {
3464*b1cdbd2cSJim Jagielski maNumFmts.writeToPropertyMap( rPropMap, nNumFmtId );
3465*b1cdbd2cSJim Jagielski }
3466*b1cdbd2cSJim Jagielski
writeBorderToPropertyMap(PropertyMap & rPropMap,sal_Int32 nBorderId) const3467*b1cdbd2cSJim Jagielski void StylesBuffer::writeBorderToPropertyMap( PropertyMap& rPropMap, sal_Int32 nBorderId ) const
3468*b1cdbd2cSJim Jagielski {
3469*b1cdbd2cSJim Jagielski if( Border* pBorder = maBorders.get( nBorderId ).get() )
3470*b1cdbd2cSJim Jagielski pBorder->writeToPropertyMap( rPropMap );
3471*b1cdbd2cSJim Jagielski }
3472*b1cdbd2cSJim Jagielski
writeFillToPropertyMap(PropertyMap & rPropMap,sal_Int32 nFillId) const3473*b1cdbd2cSJim Jagielski void StylesBuffer::writeFillToPropertyMap( PropertyMap& rPropMap, sal_Int32 nFillId ) const
3474*b1cdbd2cSJim Jagielski {
3475*b1cdbd2cSJim Jagielski if( Fill* pFill = maFills.get( nFillId ).get() )
3476*b1cdbd2cSJim Jagielski pFill->writeToPropertyMap( rPropMap );
3477*b1cdbd2cSJim Jagielski }
3478*b1cdbd2cSJim Jagielski
writeCellXfToPropertyMap(PropertyMap & rPropMap,sal_Int32 nXfId) const3479*b1cdbd2cSJim Jagielski void StylesBuffer::writeCellXfToPropertyMap( PropertyMap& rPropMap, sal_Int32 nXfId ) const
3480*b1cdbd2cSJim Jagielski {
3481*b1cdbd2cSJim Jagielski if( Xf* pXf = maCellXfs.get( nXfId ).get() )
3482*b1cdbd2cSJim Jagielski pXf->writeToPropertyMap( rPropMap );
3483*b1cdbd2cSJim Jagielski }
3484*b1cdbd2cSJim Jagielski
writeStyleXfToPropertyMap(PropertyMap & rPropMap,sal_Int32 nXfId) const3485*b1cdbd2cSJim Jagielski void StylesBuffer::writeStyleXfToPropertyMap( PropertyMap& rPropMap, sal_Int32 nXfId ) const
3486*b1cdbd2cSJim Jagielski {
3487*b1cdbd2cSJim Jagielski if( Xf* pXf = maStyleXfs.get( nXfId ).get() )
3488*b1cdbd2cSJim Jagielski pXf->writeToPropertyMap( rPropMap );
3489*b1cdbd2cSJim Jagielski }
3490*b1cdbd2cSJim Jagielski
writeCellXfToPropertySet(PropertySet & rPropSet,sal_Int32 nXfId) const3491*b1cdbd2cSJim Jagielski void StylesBuffer::writeCellXfToPropertySet( PropertySet& rPropSet, sal_Int32 nXfId ) const
3492*b1cdbd2cSJim Jagielski {
3493*b1cdbd2cSJim Jagielski if( Xf* pXf = maCellXfs.get( nXfId ).get() )
3494*b1cdbd2cSJim Jagielski pXf->writeToPropertySet( rPropSet );
3495*b1cdbd2cSJim Jagielski }
3496*b1cdbd2cSJim Jagielski
writeStyleXfToPropertySet(PropertySet & rPropSet,sal_Int32 nXfId) const3497*b1cdbd2cSJim Jagielski void StylesBuffer::writeStyleXfToPropertySet( PropertySet& rPropSet, sal_Int32 nXfId ) const
3498*b1cdbd2cSJim Jagielski {
3499*b1cdbd2cSJim Jagielski if( Xf* pXf = maStyleXfs.get( nXfId ).get() )
3500*b1cdbd2cSJim Jagielski pXf->writeToPropertySet( rPropSet );
3501*b1cdbd2cSJim Jagielski }
3502*b1cdbd2cSJim Jagielski
3503*b1cdbd2cSJim Jagielski // ============================================================================
3504*b1cdbd2cSJim Jagielski
3505*b1cdbd2cSJim Jagielski } // namespace xls
3506*b1cdbd2cSJim Jagielski } // namespace oox
3507