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 // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_xmloff.hxx"
26*b1cdbd2cSJim Jagielski
27*b1cdbd2cSJim Jagielski
28*b1cdbd2cSJim Jagielski #include <bordrhdl.hxx>
29*b1cdbd2cSJim Jagielski #include <xmloff/xmltoken.hxx>
30*b1cdbd2cSJim Jagielski #include <xmloff/xmluconv.hxx>
31*b1cdbd2cSJim Jagielski #include <rtl/ustrbuf.hxx>
32*b1cdbd2cSJim Jagielski #include <com/sun/star/uno/Any.hxx>
33*b1cdbd2cSJim Jagielski #include <com/sun/star/table/BorderLine.hpp>
34*b1cdbd2cSJim Jagielski
35*b1cdbd2cSJim Jagielski using ::rtl::OUString;
36*b1cdbd2cSJim Jagielski using ::rtl::OUStringBuffer;
37*b1cdbd2cSJim Jagielski
38*b1cdbd2cSJim Jagielski using namespace ::com::sun::star;
39*b1cdbd2cSJim Jagielski using namespace ::xmloff::token;
40*b1cdbd2cSJim Jagielski
41*b1cdbd2cSJim Jagielski // copied from svx/boxitem.hxx
42*b1cdbd2cSJim Jagielski #define DEF_LINE_WIDTH_0 1
43*b1cdbd2cSJim Jagielski #define DEF_LINE_WIDTH_1 35
44*b1cdbd2cSJim Jagielski #define DEF_LINE_WIDTH_2 88
45*b1cdbd2cSJim Jagielski #define DEF_LINE_WIDTH_3 141
46*b1cdbd2cSJim Jagielski #define DEF_LINE_WIDTH_4 176
47*b1cdbd2cSJim Jagielski
48*b1cdbd2cSJim Jagielski #define DEF_MAX_LINE_WIDHT DEF_LINE_WIDTH_4
49*b1cdbd2cSJim Jagielski #define DEF_MAX_LINE_DIST DEF_LINE_WIDTH_2
50*b1cdbd2cSJim Jagielski
51*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE0_OUT DEF_LINE_WIDTH_0
52*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE0_IN DEF_LINE_WIDTH_0
53*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE0_DIST DEF_LINE_WIDTH_1
54*b1cdbd2cSJim Jagielski
55*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE1_OUT DEF_LINE_WIDTH_1
56*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE1_IN DEF_LINE_WIDTH_1
57*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE1_DIST DEF_LINE_WIDTH_1
58*b1cdbd2cSJim Jagielski
59*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE2_OUT DEF_LINE_WIDTH_2
60*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE2_IN DEF_LINE_WIDTH_2
61*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE2_DIST DEF_LINE_WIDTH_2
62*b1cdbd2cSJim Jagielski
63*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE3_OUT DEF_LINE_WIDTH_2
64*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE3_IN DEF_LINE_WIDTH_1
65*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE3_DIST DEF_LINE_WIDTH_2
66*b1cdbd2cSJim Jagielski
67*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE4_OUT DEF_LINE_WIDTH_1
68*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE4_IN DEF_LINE_WIDTH_2
69*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE4_DIST DEF_LINE_WIDTH_1
70*b1cdbd2cSJim Jagielski
71*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE5_OUT DEF_LINE_WIDTH_3
72*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE5_IN DEF_LINE_WIDTH_2
73*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE5_DIST DEF_LINE_WIDTH_2
74*b1cdbd2cSJim Jagielski
75*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE6_OUT DEF_LINE_WIDTH_2
76*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE6_IN DEF_LINE_WIDTH_3
77*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE6_DIST DEF_LINE_WIDTH_2
78*b1cdbd2cSJim Jagielski
79*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE7_OUT DEF_LINE_WIDTH_0
80*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE7_IN DEF_LINE_WIDTH_0
81*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE7_DIST DEF_LINE_WIDTH_2
82*b1cdbd2cSJim Jagielski
83*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE8_OUT DEF_LINE_WIDTH_1
84*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE8_IN DEF_LINE_WIDTH_0
85*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE8_DIST DEF_LINE_WIDTH_2
86*b1cdbd2cSJim Jagielski
87*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE9_OUT DEF_LINE_WIDTH_2
88*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE9_IN DEF_LINE_WIDTH_0
89*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE9_DIST DEF_LINE_WIDTH_2
90*b1cdbd2cSJim Jagielski
91*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE10_OUT DEF_LINE_WIDTH_3
92*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE10_IN DEF_LINE_WIDTH_0
93*b1cdbd2cSJim Jagielski #define DEF_DOUBLE_LINE10_DIST DEF_LINE_WIDTH_2
94*b1cdbd2cSJim Jagielski
95*b1cdbd2cSJim Jagielski // finished copy
96*b1cdbd2cSJim Jagielski
97*b1cdbd2cSJim Jagielski #define SVX_XML_BORDER_STYLE_NONE 0
98*b1cdbd2cSJim Jagielski #define SVX_XML_BORDER_STYLE_SOLID 1
99*b1cdbd2cSJim Jagielski #define SVX_XML_BORDER_STYLE_DOUBLE 2
100*b1cdbd2cSJim Jagielski
101*b1cdbd2cSJim Jagielski #define SVX_XML_BORDER_WIDTH_THIN 0
102*b1cdbd2cSJim Jagielski #define SVX_XML_BORDER_WIDTH_MIDDLE 1
103*b1cdbd2cSJim Jagielski #define SVX_XML_BORDER_WIDTH_THICK 2
104*b1cdbd2cSJim Jagielski
105*b1cdbd2cSJim Jagielski SvXMLEnumMapEntry pXML_BorderStyles[] =
106*b1cdbd2cSJim Jagielski {
107*b1cdbd2cSJim Jagielski { XML_NONE, SVX_XML_BORDER_STYLE_NONE },
108*b1cdbd2cSJim Jagielski { XML_HIDDEN, SVX_XML_BORDER_STYLE_NONE },
109*b1cdbd2cSJim Jagielski { XML_SOLID, SVX_XML_BORDER_STYLE_SOLID },
110*b1cdbd2cSJim Jagielski { XML_DOUBLE, SVX_XML_BORDER_STYLE_DOUBLE },
111*b1cdbd2cSJim Jagielski { XML_DOTTED, SVX_XML_BORDER_STYLE_SOLID },
112*b1cdbd2cSJim Jagielski { XML_DASHED, SVX_XML_BORDER_STYLE_SOLID },
113*b1cdbd2cSJim Jagielski { XML_GROOVE, SVX_XML_BORDER_STYLE_SOLID },
114*b1cdbd2cSJim Jagielski { XML_RIDGE, SVX_XML_BORDER_STYLE_SOLID },
115*b1cdbd2cSJim Jagielski { XML_INSET, SVX_XML_BORDER_STYLE_SOLID },
116*b1cdbd2cSJim Jagielski { XML_OUTSET, SVX_XML_BORDER_STYLE_SOLID },
117*b1cdbd2cSJim Jagielski { XML_TOKEN_INVALID, 0 }
118*b1cdbd2cSJim Jagielski };
119*b1cdbd2cSJim Jagielski
120*b1cdbd2cSJim Jagielski SvXMLEnumMapEntry pXML_NamedBorderWidths[] =
121*b1cdbd2cSJim Jagielski {
122*b1cdbd2cSJim Jagielski { XML_THIN, SVX_XML_BORDER_WIDTH_THIN },
123*b1cdbd2cSJim Jagielski { XML_MIDDLE, SVX_XML_BORDER_WIDTH_MIDDLE },
124*b1cdbd2cSJim Jagielski { XML_THICK, SVX_XML_BORDER_WIDTH_THICK },
125*b1cdbd2cSJim Jagielski { XML_TOKEN_INVALID, 0 }
126*b1cdbd2cSJim Jagielski };
127*b1cdbd2cSJim Jagielski // mapping tables to map external xml input to intarnal box line widths
128*b1cdbd2cSJim Jagielski
129*b1cdbd2cSJim Jagielski // Ein Eintrag besteht aus vier USHORTs. Der erste ist die Gesamtbreite,
130*b1cdbd2cSJim Jagielski // die anderen sind die 3 Einzelbreiten
131*b1cdbd2cSJim Jagielski
132*b1cdbd2cSJim Jagielski #define SBORDER_ENTRY( n ) \
133*b1cdbd2cSJim Jagielski DEF_LINE_WIDTH_##n, DEF_LINE_WIDTH_##n, 0, 0
134*b1cdbd2cSJim Jagielski
135*b1cdbd2cSJim Jagielski #define DBORDER_ENTRY( n ) \
136*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_OUT + DEF_DOUBLE_LINE##n##_IN + \
137*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_DIST, \
138*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_OUT, \
139*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_IN, \
140*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_DIST
141*b1cdbd2cSJim Jagielski
142*b1cdbd2cSJim Jagielski #define TDBORDER_ENTRY( n ) \
143*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_OUT, \
144*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_OUT, \
145*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_IN, \
146*b1cdbd2cSJim Jagielski DEF_DOUBLE_LINE##n##_DIST
147*b1cdbd2cSJim Jagielski
148*b1cdbd2cSJim Jagielski
149*b1cdbd2cSJim Jagielski static sal_uInt16 __READONLY_DATA aSBorderWidths[] =
150*b1cdbd2cSJim Jagielski {
151*b1cdbd2cSJim Jagielski SBORDER_ENTRY( 0 ), SBORDER_ENTRY( 1 ), SBORDER_ENTRY( 2 ),
152*b1cdbd2cSJim Jagielski SBORDER_ENTRY( 3 ), SBORDER_ENTRY( 4 )
153*b1cdbd2cSJim Jagielski };
154*b1cdbd2cSJim Jagielski
155*b1cdbd2cSJim Jagielski static sal_uInt16 __READONLY_DATA aDBorderWidths[] =
156*b1cdbd2cSJim Jagielski {
157*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 0 ),
158*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 7 ),
159*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 1 ),
160*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 8 ),
161*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 4 ),
162*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 9 ),
163*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 3 ),
164*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 10 ),
165*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 2 ),
166*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 6 ),
167*b1cdbd2cSJim Jagielski DBORDER_ENTRY( 5 )
168*b1cdbd2cSJim Jagielski };
169*b1cdbd2cSJim Jagielski
lcl_frmitems_setXMLBorderWidth(table::BorderLine & rBorderLine,sal_uInt16 nWidth,sal_Bool bDouble)170*b1cdbd2cSJim Jagielski void lcl_frmitems_setXMLBorderWidth( table::BorderLine &rBorderLine,
171*b1cdbd2cSJim Jagielski sal_uInt16 nWidth, sal_Bool bDouble )
172*b1cdbd2cSJim Jagielski {
173*b1cdbd2cSJim Jagielski #ifdef XML_CHECK_UI_CONTSTRAINS
174*b1cdbd2cSJim Jagielski const sal_uInt16 *aWidths;
175*b1cdbd2cSJim Jagielski sal_uInt16 nSize;
176*b1cdbd2cSJim Jagielski if( !bDouble )
177*b1cdbd2cSJim Jagielski {
178*b1cdbd2cSJim Jagielski aWidths = aSBorderWidths;
179*b1cdbd2cSJim Jagielski nSize = sizeof( aSBorderWidths );
180*b1cdbd2cSJim Jagielski }
181*b1cdbd2cSJim Jagielski else
182*b1cdbd2cSJim Jagielski {
183*b1cdbd2cSJim Jagielski aWidths = aDBorderWidths;
184*b1cdbd2cSJim Jagielski nSize = sizeof( aDBorderWidths );
185*b1cdbd2cSJim Jagielski }
186*b1cdbd2cSJim Jagielski
187*b1cdbd2cSJim Jagielski sal_uInt16 i = (nSize / sizeof(sal_uInt16)) - 4;
188*b1cdbd2cSJim Jagielski while( i>0 &&
189*b1cdbd2cSJim Jagielski nWidth <= ((aWidths[i] + aWidths[i-4]) / 2) )
190*b1cdbd2cSJim Jagielski {
191*b1cdbd2cSJim Jagielski i -= 4;
192*b1cdbd2cSJim Jagielski }
193*b1cdbd2cSJim Jagielski
194*b1cdbd2cSJim Jagielski rBorderLine.OuterLineWidth = aWidths[i+1];
195*b1cdbd2cSJim Jagielski rBorderLine.InnerLineWidth = aWidths[i+2];
196*b1cdbd2cSJim Jagielski rBorderLine.LineDistance = aWidths[i+3];
197*b1cdbd2cSJim Jagielski #else
198*b1cdbd2cSJim Jagielski if( bDouble )
199*b1cdbd2cSJim Jagielski {
200*b1cdbd2cSJim Jagielski const sal_uInt16 *aWidths = aDBorderWidths;
201*b1cdbd2cSJim Jagielski sal_uInt16 nSize = sizeof( aDBorderWidths );
202*b1cdbd2cSJim Jagielski sal_uInt16 i = (nSize / sizeof(sal_uInt16)) - 4;
203*b1cdbd2cSJim Jagielski while( i>0 &&
204*b1cdbd2cSJim Jagielski nWidth <= ((aWidths[i] + aWidths[i-4]) / 2) )
205*b1cdbd2cSJim Jagielski {
206*b1cdbd2cSJim Jagielski i -= 4;
207*b1cdbd2cSJim Jagielski }
208*b1cdbd2cSJim Jagielski
209*b1cdbd2cSJim Jagielski rBorderLine.OuterLineWidth = aWidths[i+1];
210*b1cdbd2cSJim Jagielski rBorderLine.InnerLineWidth = aWidths[i+2];
211*b1cdbd2cSJim Jagielski rBorderLine.LineDistance = aWidths[i+3];
212*b1cdbd2cSJim Jagielski }
213*b1cdbd2cSJim Jagielski else
214*b1cdbd2cSJim Jagielski {
215*b1cdbd2cSJim Jagielski rBorderLine.OuterLineWidth = 0 == nWidth ? DEF_LINE_WIDTH_0 : nWidth;
216*b1cdbd2cSJim Jagielski rBorderLine.InnerLineWidth = 0;
217*b1cdbd2cSJim Jagielski rBorderLine.LineDistance = 0;
218*b1cdbd2cSJim Jagielski
219*b1cdbd2cSJim Jagielski }
220*b1cdbd2cSJim Jagielski #endif
221*b1cdbd2cSJim Jagielski }
222*b1cdbd2cSJim Jagielski
223*b1cdbd2cSJim Jagielski
224*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
225*b1cdbd2cSJim Jagielski //
226*b1cdbd2cSJim Jagielski // class XMLEscapementPropHdl
227*b1cdbd2cSJim Jagielski //
228*b1cdbd2cSJim Jagielski
~XMLBorderWidthHdl()229*b1cdbd2cSJim Jagielski XMLBorderWidthHdl::~XMLBorderWidthHdl()
230*b1cdbd2cSJim Jagielski {
231*b1cdbd2cSJim Jagielski // nothing to do
232*b1cdbd2cSJim Jagielski }
233*b1cdbd2cSJim Jagielski
importXML(const OUString & rStrImpValue,uno::Any & rValue,const SvXMLUnitConverter & rUnitConverter) const234*b1cdbd2cSJim Jagielski sal_Bool XMLBorderWidthHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
235*b1cdbd2cSJim Jagielski {
236*b1cdbd2cSJim Jagielski SvXMLTokenEnumerator aTokenEnum( rStrImpValue );
237*b1cdbd2cSJim Jagielski
238*b1cdbd2cSJim Jagielski sal_Int32 nInWidth, nDistance, nOutWidth;
239*b1cdbd2cSJim Jagielski
240*b1cdbd2cSJim Jagielski OUString aToken;
241*b1cdbd2cSJim Jagielski if( !aTokenEnum.getNextToken( aToken ) )
242*b1cdbd2cSJim Jagielski return sal_False;
243*b1cdbd2cSJim Jagielski
244*b1cdbd2cSJim Jagielski if( !rUnitConverter.convertMeasure( nInWidth, aToken, 0, 500 ) )
245*b1cdbd2cSJim Jagielski return sal_False;
246*b1cdbd2cSJim Jagielski
247*b1cdbd2cSJim Jagielski if( !aTokenEnum.getNextToken( aToken ) )
248*b1cdbd2cSJim Jagielski return sal_False;
249*b1cdbd2cSJim Jagielski
250*b1cdbd2cSJim Jagielski if( !rUnitConverter.convertMeasure( nDistance, aToken, 0, 500 ) )
251*b1cdbd2cSJim Jagielski return sal_False;
252*b1cdbd2cSJim Jagielski
253*b1cdbd2cSJim Jagielski if( !aTokenEnum.getNextToken( aToken ) )
254*b1cdbd2cSJim Jagielski return sal_False;
255*b1cdbd2cSJim Jagielski
256*b1cdbd2cSJim Jagielski if( !rUnitConverter.convertMeasure( nOutWidth, aToken, 0, 500 ) )
257*b1cdbd2cSJim Jagielski return sal_False;
258*b1cdbd2cSJim Jagielski
259*b1cdbd2cSJim Jagielski #ifdef XML_CHECK_UI_CONSTRAINS
260*b1cdbd2cSJim Jagielski sal_uInt16 nSize = sizeof( aDBorderWidths );
261*b1cdbd2cSJim Jagielski for( sal_uInt16 i=0; i < nSize; i += 4 )
262*b1cdbd2cSJim Jagielski {
263*b1cdbd2cSJim Jagielski if( aDBorderWidths[i+1] == nOutWidth &&
264*b1cdbd2cSJim Jagielski aDBorderWidths[i+2] == nInWidth &&
265*b1cdbd2cSJim Jagielski aDBorderWidths[i+3] == nDistance )
266*b1cdbd2cSJim Jagielski break;
267*b1cdbd2cSJim Jagielski }
268*b1cdbd2cSJim Jagielski
269*b1cdbd2cSJim Jagielski sal_uInt16 nWidth = i < nSize ? 0 : nOutWidth + nInWidth + nDistance;
270*b1cdbd2cSJim Jagielski #endif
271*b1cdbd2cSJim Jagielski
272*b1cdbd2cSJim Jagielski table::BorderLine aBorderLine;
273*b1cdbd2cSJim Jagielski if(!(rValue >>= aBorderLine))
274*b1cdbd2cSJim Jagielski aBorderLine.Color = 0;
275*b1cdbd2cSJim Jagielski
276*b1cdbd2cSJim Jagielski aBorderLine.InnerLineWidth = sal::static_int_cast< sal_Int16 >(nInWidth);
277*b1cdbd2cSJim Jagielski aBorderLine.OuterLineWidth = sal::static_int_cast< sal_Int16 >(nOutWidth);
278*b1cdbd2cSJim Jagielski aBorderLine.LineDistance = sal::static_int_cast< sal_Int16 >(nDistance);
279*b1cdbd2cSJim Jagielski
280*b1cdbd2cSJim Jagielski rValue <<= aBorderLine;
281*b1cdbd2cSJim Jagielski return sal_True;
282*b1cdbd2cSJim Jagielski }
283*b1cdbd2cSJim Jagielski
exportXML(OUString & rStrExpValue,const uno::Any & rValue,const SvXMLUnitConverter & rUnitConverter) const284*b1cdbd2cSJim Jagielski sal_Bool XMLBorderWidthHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
285*b1cdbd2cSJim Jagielski {
286*b1cdbd2cSJim Jagielski OUStringBuffer aOut;
287*b1cdbd2cSJim Jagielski
288*b1cdbd2cSJim Jagielski table::BorderLine aBorderLine;
289*b1cdbd2cSJim Jagielski if(!(rValue >>= aBorderLine))
290*b1cdbd2cSJim Jagielski return sal_False;
291*b1cdbd2cSJim Jagielski
292*b1cdbd2cSJim Jagielski if( aBorderLine.LineDistance == 0 && aBorderLine.InnerLineWidth == 0)
293*b1cdbd2cSJim Jagielski return sal_False;
294*b1cdbd2cSJim Jagielski
295*b1cdbd2cSJim Jagielski rUnitConverter.convertMeasure( aOut, aBorderLine.InnerLineWidth );
296*b1cdbd2cSJim Jagielski aOut.append( sal_Unicode( ' ' ) );
297*b1cdbd2cSJim Jagielski rUnitConverter.convertMeasure( aOut, aBorderLine.LineDistance );
298*b1cdbd2cSJim Jagielski aOut.append( sal_Unicode( ' ' ) );
299*b1cdbd2cSJim Jagielski rUnitConverter.convertMeasure( aOut, aBorderLine.OuterLineWidth );
300*b1cdbd2cSJim Jagielski
301*b1cdbd2cSJim Jagielski rStrExpValue = aOut.makeStringAndClear();
302*b1cdbd2cSJim Jagielski return sal_True;
303*b1cdbd2cSJim Jagielski }
304*b1cdbd2cSJim Jagielski
305*b1cdbd2cSJim Jagielski ///////////////////////////////////////////////////////////////////////////////
306*b1cdbd2cSJim Jagielski //
307*b1cdbd2cSJim Jagielski // class XMLEscapementHeightPropHdl
308*b1cdbd2cSJim Jagielski //
309*b1cdbd2cSJim Jagielski
~XMLBorderHdl()310*b1cdbd2cSJim Jagielski XMLBorderHdl::~XMLBorderHdl()
311*b1cdbd2cSJim Jagielski {
312*b1cdbd2cSJim Jagielski // nothing to do
313*b1cdbd2cSJim Jagielski }
314*b1cdbd2cSJim Jagielski
importXML(const OUString & rStrImpValue,uno::Any & rValue,const SvXMLUnitConverter & rUnitConverter) const315*b1cdbd2cSJim Jagielski sal_Bool XMLBorderHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski OUString aToken;
318*b1cdbd2cSJim Jagielski SvXMLTokenEnumerator aTokens( rStrImpValue );
319*b1cdbd2cSJim Jagielski
320*b1cdbd2cSJim Jagielski sal_Bool bHasStyle = sal_False;
321*b1cdbd2cSJim Jagielski sal_Bool bHasWidth = sal_False;
322*b1cdbd2cSJim Jagielski sal_Bool bHasColor = sal_False;
323*b1cdbd2cSJim Jagielski
324*b1cdbd2cSJim Jagielski sal_uInt16 nStyle = USHRT_MAX;
325*b1cdbd2cSJim Jagielski sal_uInt16 nWidth = 0;
326*b1cdbd2cSJim Jagielski sal_uInt16 nNamedWidth = USHRT_MAX;
327*b1cdbd2cSJim Jagielski Color aColor;
328*b1cdbd2cSJim Jagielski
329*b1cdbd2cSJim Jagielski sal_Int32 nTemp;
330*b1cdbd2cSJim Jagielski while( aTokens.getNextToken( aToken ) && aToken.getLength() != 0 )
331*b1cdbd2cSJim Jagielski {
332*b1cdbd2cSJim Jagielski if( !bHasWidth &&
333*b1cdbd2cSJim Jagielski rUnitConverter.convertEnum( nNamedWidth, aToken,
334*b1cdbd2cSJim Jagielski pXML_NamedBorderWidths ) )
335*b1cdbd2cSJim Jagielski {
336*b1cdbd2cSJim Jagielski bHasWidth = sal_True;
337*b1cdbd2cSJim Jagielski }
338*b1cdbd2cSJim Jagielski else if( !bHasStyle &&
339*b1cdbd2cSJim Jagielski rUnitConverter.convertEnum( nStyle, aToken,
340*b1cdbd2cSJim Jagielski pXML_BorderStyles ) )
341*b1cdbd2cSJim Jagielski {
342*b1cdbd2cSJim Jagielski bHasStyle = sal_True;
343*b1cdbd2cSJim Jagielski }
344*b1cdbd2cSJim Jagielski else if( !bHasColor && rUnitConverter.convertColor( aColor, aToken ) )
345*b1cdbd2cSJim Jagielski {
346*b1cdbd2cSJim Jagielski bHasColor = sal_True;
347*b1cdbd2cSJim Jagielski }
348*b1cdbd2cSJim Jagielski else if( !bHasWidth &&
349*b1cdbd2cSJim Jagielski rUnitConverter.convertMeasure( nTemp, aToken, 0,
350*b1cdbd2cSJim Jagielski USHRT_MAX ) )
351*b1cdbd2cSJim Jagielski {
352*b1cdbd2cSJim Jagielski nWidth = (sal_uInt16)nTemp;
353*b1cdbd2cSJim Jagielski bHasWidth = sal_True;
354*b1cdbd2cSJim Jagielski }
355*b1cdbd2cSJim Jagielski else
356*b1cdbd2cSJim Jagielski {
357*b1cdbd2cSJim Jagielski // missformed
358*b1cdbd2cSJim Jagielski return sal_False;
359*b1cdbd2cSJim Jagielski }
360*b1cdbd2cSJim Jagielski }
361*b1cdbd2cSJim Jagielski
362*b1cdbd2cSJim Jagielski // if there is no style or a different style than none but no width,
363*b1cdbd2cSJim Jagielski // then the declaration is not valid.
364*b1cdbd2cSJim Jagielski if( !bHasStyle || (SVX_XML_BORDER_STYLE_NONE != nStyle && !bHasWidth) )
365*b1cdbd2cSJim Jagielski return sal_False;
366*b1cdbd2cSJim Jagielski
367*b1cdbd2cSJim Jagielski table::BorderLine aBorderLine;
368*b1cdbd2cSJim Jagielski if(!(rValue >>= aBorderLine))
369*b1cdbd2cSJim Jagielski {
370*b1cdbd2cSJim Jagielski aBorderLine.Color = 0;
371*b1cdbd2cSJim Jagielski aBorderLine.InnerLineWidth = 0;
372*b1cdbd2cSJim Jagielski aBorderLine.OuterLineWidth = 0;
373*b1cdbd2cSJim Jagielski aBorderLine.LineDistance = 0;
374*b1cdbd2cSJim Jagielski }
375*b1cdbd2cSJim Jagielski
376*b1cdbd2cSJim Jagielski // first of all, delete an empty line
377*b1cdbd2cSJim Jagielski sal_Bool bDouble = SVX_XML_BORDER_STYLE_DOUBLE == nStyle;
378*b1cdbd2cSJim Jagielski if( (bHasStyle && SVX_XML_BORDER_STYLE_NONE == nStyle) ||
379*b1cdbd2cSJim Jagielski (bHasWidth && USHRT_MAX == nNamedWidth && 0 == nWidth) )
380*b1cdbd2cSJim Jagielski {
381*b1cdbd2cSJim Jagielski aBorderLine.InnerLineWidth = 0;
382*b1cdbd2cSJim Jagielski aBorderLine.OuterLineWidth = 0;
383*b1cdbd2cSJim Jagielski aBorderLine.LineDistance = 0;
384*b1cdbd2cSJim Jagielski }
385*b1cdbd2cSJim Jagielski else if( bHasWidth )
386*b1cdbd2cSJim Jagielski {
387*b1cdbd2cSJim Jagielski if( USHRT_MAX != nNamedWidth )
388*b1cdbd2cSJim Jagielski {
389*b1cdbd2cSJim Jagielski const sal_uInt16 *aWidths = bDouble ? aDBorderWidths
390*b1cdbd2cSJim Jagielski : aSBorderWidths;
391*b1cdbd2cSJim Jagielski sal_uInt16 nNWidth = nNamedWidth * 4;
392*b1cdbd2cSJim Jagielski aBorderLine.OuterLineWidth = aWidths[nNWidth+1];
393*b1cdbd2cSJim Jagielski aBorderLine.InnerLineWidth = aWidths[nNWidth+2];
394*b1cdbd2cSJim Jagielski aBorderLine.LineDistance = aWidths[nNWidth+3];
395*b1cdbd2cSJim Jagielski }
396*b1cdbd2cSJim Jagielski else
397*b1cdbd2cSJim Jagielski {
398*b1cdbd2cSJim Jagielski lcl_frmitems_setXMLBorderWidth( aBorderLine, nWidth, bDouble );
399*b1cdbd2cSJim Jagielski }
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski else
402*b1cdbd2cSJim Jagielski {
403*b1cdbd2cSJim Jagielski lcl_frmitems_setXMLBorderWidth( aBorderLine, 0, bDouble );
404*b1cdbd2cSJim Jagielski }
405*b1cdbd2cSJim Jagielski
406*b1cdbd2cSJim Jagielski // set color
407*b1cdbd2cSJim Jagielski if( bHasColor )
408*b1cdbd2cSJim Jagielski aBorderLine.Color = (sal_Int32)aColor.GetRGBColor();
409*b1cdbd2cSJim Jagielski
410*b1cdbd2cSJim Jagielski rValue <<= aBorderLine;
411*b1cdbd2cSJim Jagielski return sal_True;
412*b1cdbd2cSJim Jagielski }
413*b1cdbd2cSJim Jagielski
exportXML(OUString & rStrExpValue,const uno::Any & rValue,const SvXMLUnitConverter & rUnitConverter) const414*b1cdbd2cSJim Jagielski sal_Bool XMLBorderHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& rUnitConverter ) const
415*b1cdbd2cSJim Jagielski {
416*b1cdbd2cSJim Jagielski OUStringBuffer aOut;
417*b1cdbd2cSJim Jagielski
418*b1cdbd2cSJim Jagielski table::BorderLine aBorderLine;
419*b1cdbd2cSJim Jagielski if(!(rValue >>= aBorderLine))
420*b1cdbd2cSJim Jagielski return sal_False;
421*b1cdbd2cSJim Jagielski
422*b1cdbd2cSJim Jagielski sal_Int32 nWidth = aBorderLine.OuterLineWidth;
423*b1cdbd2cSJim Jagielski const sal_uInt16 nDistance = aBorderLine.LineDistance;
424*b1cdbd2cSJim Jagielski if( 0 != nDistance )
425*b1cdbd2cSJim Jagielski {
426*b1cdbd2cSJim Jagielski nWidth += nDistance;
427*b1cdbd2cSJim Jagielski nWidth += aBorderLine.InnerLineWidth;
428*b1cdbd2cSJim Jagielski }
429*b1cdbd2cSJim Jagielski
430*b1cdbd2cSJim Jagielski if( nWidth == 0 )
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski aOut.append( GetXMLToken( XML_NONE ) );
433*b1cdbd2cSJim Jagielski }
434*b1cdbd2cSJim Jagielski else
435*b1cdbd2cSJim Jagielski {
436*b1cdbd2cSJim Jagielski rUnitConverter.convertMeasure( aOut, nWidth );
437*b1cdbd2cSJim Jagielski
438*b1cdbd2cSJim Jagielski aOut.append( sal_Unicode( ' ' ) );
439*b1cdbd2cSJim Jagielski
440*b1cdbd2cSJim Jagielski aOut.append( GetXMLToken((0 == nDistance) ? XML_SOLID : XML_DOUBLE) );
441*b1cdbd2cSJim Jagielski
442*b1cdbd2cSJim Jagielski aOut.append( sal_Unicode( ' ' ) );
443*b1cdbd2cSJim Jagielski
444*b1cdbd2cSJim Jagielski rUnitConverter.convertColor( aOut, aBorderLine.Color );
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski
447*b1cdbd2cSJim Jagielski rStrExpValue = aOut.makeStringAndClear();
448*b1cdbd2cSJim Jagielski
449*b1cdbd2cSJim Jagielski return sal_True;
450*b1cdbd2cSJim Jagielski }
451