xref: /aoo4110/main/xmloff/source/style/bordrhdl.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 // 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