1 /*************************************************************************
2  *
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * Copyright 2000, 2010 Oracle and/or its affiliates.
6  *
7  * OpenOffice.org - a multi-platform office productivity suite
8  *
9  * This file is part of OpenOffice.org.
10  *
11  * OpenOffice.org is free software: you can redistribute it and/or modify
12  * it under the terms of the GNU Lesser General Public License version 3
13  * only, as published by the Free Software Foundation.
14  *
15  * OpenOffice.org is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Lesser General Public License version 3 for more details
19  * (a copy is included in the LICENSE file that accompanied this code).
20  *
21  * You should have received a copy of the GNU Lesser General Public License
22  * version 3 along with OpenOffice.org.  If not, see
23  * <http://www.openoffice.org/license.html>
24  * for a copy of the LGPLv3 License.
25  *
26  ************************************************************************/
27 
28 // MARKER(update_precomp.py): autogen include statement, do not remove
29 #include "precompiled_xmloff.hxx"
30 #include <tools/debug.hxx>
31 #include <rtl/ustrbuf.hxx>
32 
33 
34 #include <com/sun/star/text/XTextColumns.hpp>
35 #include <com/sun/star/text/TextColumn.hpp>
36 #include <com/sun/star/style/VerticalAlignment.hpp>
37 #include <com/sun/star/beans/XPropertySet.hpp>
38 
39 
40 #include <xmloff/xmltoken.hxx>
41 #include "xmloff/xmlnmspe.hxx"
42 #include <xmloff/xmluconv.hxx>
43 #include <xmloff/xmlexp.hxx>
44 #include "XMLTextColumnsExport.hxx"
45 
46 using namespace ::com::sun::star::style;
47 using namespace ::com::sun::star::text;
48 using namespace ::com::sun::star::uno;
49 using namespace ::com::sun::star::beans;
50 using ::rtl::OUString;
51 using ::rtl::OUStringBuffer;
52 using namespace ::xmloff::token;
53 
54 
55 XMLTextColumnsExport::XMLTextColumnsExport( SvXMLExport& rExp ) :
56 	rExport( rExp ),
57 	sSeparatorLineIsOn(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineIsOn")),
58 	sSeparatorLineWidth(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineWidth")),
59 	sSeparatorLineColor(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineColor")),
60 	sSeparatorLineRelativeHeight(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineRelativeHeight")),
61 	sSeparatorLineVerticalAlignment(RTL_CONSTASCII_USTRINGPARAM("SeparatorLineVerticalAlignment")),
62     sIsAutomatic(RTL_CONSTASCII_USTRINGPARAM("IsAutomatic")),
63     sAutomaticDistance(RTL_CONSTASCII_USTRINGPARAM("AutomaticDistance"))
64 {
65 }
66 
67 void XMLTextColumnsExport::exportXML( const Any& rAny )
68 {
69 	Reference < XTextColumns > xColumns;
70 	rAny >>= xColumns;
71 
72 	Sequence < TextColumn > aColumns = xColumns->getColumns();
73 	const TextColumn *pColumns = aColumns.getArray();
74 	sal_Int32 nCount = aColumns.getLength();
75 
76 	OUStringBuffer sValue;
77 	GetExport().GetMM100UnitConverter().convertNumber( sValue, nCount ? nCount : 1 );
78 	GetExport().AddAttribute( XML_NAMESPACE_FO, XML_COLUMN_COUNT,
79 							  sValue.makeStringAndClear() );
80 
81     // handle 'automatic' columns
82 	Reference < XPropertySet > xPropSet( xColumns, UNO_QUERY );
83     if( xPropSet.is() )
84     {
85         Any aAny = xPropSet->getPropertyValue( sIsAutomatic );
86         if ( *(sal_Bool*)aAny.getValue() )
87         {
88             aAny = xPropSet->getPropertyValue( sAutomaticDistance );
89             sal_Int32 nDistance = 0;
90             aAny >>= nDistance;
91             OUStringBuffer aBuffer;
92             GetExport().GetMM100UnitConverter().convertMeasure(
93                 aBuffer, nDistance );
94             GetExport().AddAttribute( XML_NAMESPACE_FO,
95                                       XML_COLUMN_GAP,
96                                       aBuffer.makeStringAndClear() );
97         }
98     }
99 
100 	SvXMLElementExport aElem( GetExport(), XML_NAMESPACE_STYLE, XML_COLUMNS,
101 							  sal_True, sal_True );
102 
103 	if( xPropSet.is() )
104 	{
105 		Any aAny = xPropSet->getPropertyValue( sSeparatorLineIsOn );
106 		if( *(sal_Bool *)aAny.getValue() )
107 		{
108 			// style:width
109 			aAny = xPropSet->getPropertyValue( sSeparatorLineWidth );
110 			sal_Int32 nWidth = 0;
111 			aAny >>= nWidth;
112 			GetExport().GetMM100UnitConverter().convertMeasure( sValue,
113 																nWidth );
114 			GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_WIDTH,
115 									  sValue.makeStringAndClear() );
116 
117 			// style:color
118 			aAny = xPropSet->getPropertyValue( sSeparatorLineColor );
119 			sal_Int32 nColor = 0;
120 			aAny >>= nColor;
121 			GetExport().GetMM100UnitConverter().convertColor( sValue,
122 															  nColor );
123 			GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_COLOR,
124 									  sValue.makeStringAndClear() );
125 
126 			// style:height
127 			aAny = xPropSet->getPropertyValue( sSeparatorLineRelativeHeight );
128 			sal_Int8 nHeight = 0;
129 			aAny >>= nHeight;
130 			GetExport().GetMM100UnitConverter().convertPercent( sValue,
131 																nHeight );
132 			GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_HEIGHT,
133 									  sValue.makeStringAndClear() );
134 
135 			// style:vertical-align
136 			aAny = xPropSet->getPropertyValue( sSeparatorLineVerticalAlignment );
137 			VerticalAlignment eVertAlign;
138 			aAny >>= eVertAlign;
139 
140 			enum XMLTokenEnum eStr = XML_TOKEN_INVALID;
141 			switch( eVertAlign )
142 			{
143 //			case VerticalAlignment_TOP: eStr = XML_TOP;
144 			case VerticalAlignment_MIDDLE: eStr = XML_MIDDLE; break;
145 			case VerticalAlignment_BOTTOM: eStr = XML_BOTTOM; break;
146 			default:
147 				break;
148 			}
149 
150 			if( eStr != XML_TOKEN_INVALID)
151 				GetExport().AddAttribute( XML_NAMESPACE_STYLE,
152                                           XML_VERTICAL_ALIGN, eStr );
153 
154 			// style:column-sep
155 			SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE,
156 									  XML_COLUMN_SEP,
157 									  sal_True, sal_True );
158 		}
159 	}
160 
161 	while( nCount-- )
162 	{
163 		// style:rel-width
164 		GetExport().GetMM100UnitConverter().convertNumber( sValue,
165 													   pColumns->Width );
166 		sValue.append( (sal_Unicode)'*' );
167 		GetExport().AddAttribute( XML_NAMESPACE_STYLE, XML_REL_WIDTH,
168 								  sValue.makeStringAndClear() );
169 
170 		// fo:margin-left
171 		GetExport().GetMM100UnitConverter().convertMeasure( sValue,
172 													   pColumns->LeftMargin );
173 		GetExport().AddAttribute( XML_NAMESPACE_FO, XML_START_INDENT,
174 			   				  	  sValue.makeStringAndClear() );
175 
176 		// fo:margin-right
177 		GetExport().GetMM100UnitConverter().convertMeasure( sValue,
178 													   pColumns->RightMargin );
179 		GetExport().AddAttribute( XML_NAMESPACE_FO, XML_END_INDENT,
180 				  				  sValue.makeStringAndClear() );
181 
182 		// style:column
183 		SvXMLElementExport aElement( GetExport(), XML_NAMESPACE_STYLE, XML_COLUMN,
184 								  sal_True, sal_True );
185 		pColumns++;
186 	}
187 }
188 
189 
190