xref: /aoo4110/main/oox/source/xls/stylesbuffer.cxx (revision b1cdbd2c)
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