Branch data Line data Source code
1 : : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : : /*************************************************************************
3 : : *
4 : : * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 : : *
6 : : * Copyright 2000, 2010 Oracle and/or its affiliates.
7 : : *
8 : : * OpenOffice.org - a multi-platform office productivity suite
9 : : *
10 : : * This file is part of OpenOffice.org.
11 : : *
12 : : * OpenOffice.org is free software: you can redistribute it and/or modify
13 : : * it under the terms of the GNU Lesser General Public License version 3
14 : : * only, as published by the Free Software Foundation.
15 : : *
16 : : * OpenOffice.org is distributed in the hope that it will be useful,
17 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 : : * GNU Lesser General Public License version 3 for more details
20 : : * (a copy is included in the LICENSE file that accompanied this code).
21 : : *
22 : : * You should have received a copy of the GNU Lesser General Public License
23 : : * version 3 along with OpenOffice.org. If not, see
24 : : * <http://www.openoffice.org/license.html>
25 : : * for a copy of the LGPLv3 License.
26 : : *
27 : : ************************************************************************/
28 : :
29 : : #include <tools/debug.hxx>
30 : : #include <backhdl.hxx>
31 : : #include <xmloff/xmltoken.hxx>
32 : : #include <xmloff/xmluconv.hxx>
33 : : #include <sax/tools/converter.hxx>
34 : : #include <com/sun/star/uno/Any.hxx>
35 : : #include <rtl/ustrbuf.hxx>
36 : :
37 : : using ::rtl::OUString;
38 : : using ::rtl::OUStringBuffer;
39 : :
40 : : using namespace ::com::sun::star;
41 : : using namespace ::xmloff::token;
42 : :
43 : : SvXMLEnumMapEntry pXML_BrushHorizontalPos[] =
44 : : {
45 : : { XML_LEFT, style::GraphicLocation_LEFT_MIDDLE },
46 : : { XML_RIGHT, style::GraphicLocation_RIGHT_MIDDLE },
47 : : { XML_TOKEN_INVALID, 0 }
48 : : };
49 : :
50 : : SvXMLEnumMapEntry pXML_BrushVerticalPos[] =
51 : : {
52 : : { XML_TOP, style::GraphicLocation_MIDDLE_TOP },
53 : : { XML_BOTTOM, style::GraphicLocation_MIDDLE_BOTTOM },
54 : : { XML_TOKEN_INVALID, 0 }
55 : : };
56 : :
57 : : ///////////////////////////////////////////////////////////////////////////////
58 : : //
59 : : // class XMLBackGraphicPositionPropHdl
60 : : //
61 : :
62 : 0 : XMLBackGraphicPositionPropHdl::~XMLBackGraphicPositionPropHdl()
63 : : {
64 : : // Nothing to do
65 [ # # ]: 0 : }
66 : :
67 : 0 : sal_Bool XMLBackGraphicPositionPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const
68 : : {
69 : 0 : sal_Bool bRet = sal_True;
70 : 0 : style::GraphicLocation ePos = style::GraphicLocation_NONE, eTmp;
71 : : sal_uInt16 nTmp;
72 [ # # ]: 0 : SvXMLTokenEnumerator aTokenEnum( rStrImpValue );
73 : 0 : OUString aToken;
74 : 0 : sal_Bool bHori = sal_False, bVert = sal_False;
75 : :
76 [ # # ][ # # ]: 0 : while( bRet && aTokenEnum.getNextToken( aToken ) )
[ # # ][ # # ]
77 : : {
78 [ # # ][ # # ]: 0 : if( bHori && bVert )
79 : : {
80 : 0 : bRet = sal_False;
81 : : }
82 [ # # ]: 0 : else if( -1 != aToken.indexOf( sal_Unicode('%') ) )
83 : : {
84 : 0 : sal_Int32 nPrc = 50;
85 [ # # ][ # # ]: 0 : if (::sax::Converter::convertPercent( nPrc, aToken ))
86 : : {
87 [ # # ]: 0 : if( !bHori )
88 : : {
89 : : ePos = nPrc < 25 ? style::GraphicLocation_LEFT_TOP :
90 : : (nPrc < 75 ? style::GraphicLocation_MIDDLE_MIDDLE :
91 [ # # ][ # # ]: 0 : style::GraphicLocation_RIGHT_BOTTOM);
92 : 0 : bHori = sal_True;
93 : : }
94 : : else
95 : : {
96 : : eTmp = nPrc < 25 ? style::GraphicLocation_LEFT_TOP:
97 : : (nPrc < 75 ? style::GraphicLocation_LEFT_MIDDLE :
98 [ # # ][ # # ]: 0 : style::GraphicLocation_LEFT_BOTTOM);
99 : 0 : MergeXMLVertPos( ePos, eTmp );
100 : 0 : bVert = sal_True;
101 : : }
102 : : }
103 : : else
104 : : {
105 : : // wrong percentage
106 : 0 : bRet = sal_False;
107 : : }
108 : : }
109 [ # # ][ # # ]: 0 : else if( IsXMLToken( aToken, XML_CENTER ) )
110 : : {
111 [ # # ]: 0 : if( bHori )
112 : 0 : MergeXMLVertPos( ePos, style::GraphicLocation_MIDDLE_MIDDLE );
113 [ # # ]: 0 : else if ( bVert )
114 : 0 : MergeXMLHoriPos( ePos, style::GraphicLocation_MIDDLE_MIDDLE );
115 : : else
116 : 0 : ePos = style::GraphicLocation_MIDDLE_MIDDLE;
117 : : }
118 [ # # ][ # # ]: 0 : else if( SvXMLUnitConverter::convertEnum( nTmp, aToken, pXML_BrushHorizontalPos ) )
119 : : {
120 [ # # ]: 0 : if( bVert )
121 : 0 : MergeXMLHoriPos( ePos, (style::GraphicLocation)nTmp );
122 [ # # ]: 0 : else if( !bHori )
123 : 0 : ePos = (style::GraphicLocation)nTmp;
124 : : else
125 : 0 : bRet = sal_False;
126 : :
127 : 0 : bHori = sal_True;
128 : : }
129 [ # # ][ # # ]: 0 : else if( SvXMLUnitConverter::convertEnum( nTmp, aToken, pXML_BrushVerticalPos ) )
130 : : {
131 [ # # ]: 0 : if( bHori )
132 : 0 : MergeXMLVertPos( ePos, (style::GraphicLocation)nTmp );
133 [ # # ]: 0 : else if( !bVert )
134 : 0 : ePos = (style::GraphicLocation)nTmp;
135 : : else
136 : 0 : bRet = sal_False;
137 : 0 : bVert = sal_True;
138 : : }
139 : : else
140 : : {
141 : 0 : bRet = sal_False;
142 : : }
143 : : }
144 : :
145 : 0 : bRet &= style::GraphicLocation_NONE != ePos;
146 [ # # ]: 0 : if( bRet )
147 [ # # ]: 0 : rValue <<= (style::GraphicLocation)(sal_uInt16)ePos;
148 : :
149 : 0 : return bRet;
150 : : }
151 : :
152 : 0 : sal_Bool XMLBackGraphicPositionPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const
153 : : {
154 : 0 : sal_Bool bRet = sal_True;
155 : 0 : OUStringBuffer aOut;
156 : :
157 : : style::GraphicLocation eLocation;
158 [ # # ][ # # ]: 0 : if( !( rValue >>= eLocation ) )
159 : : {
160 : 0 : sal_Int32 nValue = 0;
161 [ # # ]: 0 : if( rValue >>= nValue )
162 : 0 : eLocation = (style::GraphicLocation)nValue;
163 : : else
164 : 0 : bRet = sal_False;
165 : : }
166 : :
167 [ # # ]: 0 : if( bRet )
168 : : {
169 : 0 : bRet = sal_False;
170 : :
171 [ # # # # ]: 0 : switch( eLocation )
172 : : {
173 : : case style::GraphicLocation_LEFT_TOP:
174 : : case style::GraphicLocation_MIDDLE_TOP:
175 : : case style::GraphicLocation_RIGHT_TOP:
176 [ # # ][ # # ]: 0 : aOut.append( GetXMLToken(XML_TOP) );
177 : 0 : bRet = sal_True;
178 : 0 : break;
179 : : case style::GraphicLocation_LEFT_MIDDLE:
180 : : case style::GraphicLocation_MIDDLE_MIDDLE:
181 : : case style::GraphicLocation_RIGHT_MIDDLE:
182 [ # # ][ # # ]: 0 : aOut.append( GetXMLToken(XML_CENTER) );
183 : 0 : bRet = sal_True;
184 : 0 : break;
185 : : case style::GraphicLocation_LEFT_BOTTOM:
186 : : case style::GraphicLocation_MIDDLE_BOTTOM:
187 : : case style::GraphicLocation_RIGHT_BOTTOM:
188 [ # # ][ # # ]: 0 : aOut.append( GetXMLToken(XML_BOTTOM) );
189 : 0 : bRet = sal_True;
190 : 0 : break;
191 : : default:
192 : 0 : break;
193 : : }
194 : :
195 [ # # ]: 0 : if( bRet )
196 : : {
197 [ # # ]: 0 : aOut.append( sal_Unicode( ' ' ) );
198 : :
199 [ # # # # ]: 0 : switch( eLocation )
200 : : {
201 : : case style::GraphicLocation_LEFT_TOP:
202 : : case style::GraphicLocation_LEFT_BOTTOM:
203 : : case style::GraphicLocation_LEFT_MIDDLE:
204 [ # # ][ # # ]: 0 : aOut.append( GetXMLToken(XML_LEFT) );
205 : 0 : break;
206 : : case style::GraphicLocation_MIDDLE_TOP:
207 : : case style::GraphicLocation_MIDDLE_MIDDLE:
208 : : case style::GraphicLocation_MIDDLE_BOTTOM:
209 [ # # ][ # # ]: 0 : aOut.append( GetXMLToken(XML_CENTER) );
210 : 0 : break;
211 : : case style::GraphicLocation_RIGHT_MIDDLE:
212 : : case style::GraphicLocation_RIGHT_TOP:
213 : : case style::GraphicLocation_RIGHT_BOTTOM:
214 [ # # ][ # # ]: 0 : aOut.append( GetXMLToken(XML_RIGHT) );
215 : 0 : break;
216 : : default:
217 : 0 : break;
218 : : }
219 : : }
220 : : }
221 : :
222 [ # # ]: 0 : rStrExpValue = aOut.makeStringAndClear();
223 : :
224 : 0 : return bRet;
225 : : }
226 : :
227 : 0 : void XMLBackGraphicPositionPropHdl::MergeXMLVertPos( style::GraphicLocation& ePos, style::GraphicLocation eVert ) const
228 : : {
229 [ # # # # ]: 0 : switch( ePos )
230 : : {
231 : : case style::GraphicLocation_LEFT_TOP:
232 : : case style::GraphicLocation_LEFT_MIDDLE:
233 : : case style::GraphicLocation_LEFT_BOTTOM:
234 : : ePos = style::GraphicLocation_MIDDLE_TOP==eVert ?
235 : : style::GraphicLocation_LEFT_TOP :
236 : : (style::GraphicLocation_MIDDLE_MIDDLE==eVert ?
237 : : style::GraphicLocation_LEFT_MIDDLE :
238 [ # # ][ # # ]: 0 : style::GraphicLocation_LEFT_BOTTOM);
239 : 0 : ePos = eVert;
240 : 0 : break;
241 : :
242 : : case style::GraphicLocation_MIDDLE_TOP:
243 : : case style::GraphicLocation_MIDDLE_MIDDLE:
244 : : case style::GraphicLocation_MIDDLE_BOTTOM:
245 : 0 : ePos = eVert;
246 : 0 : break;
247 : :
248 : : case style::GraphicLocation_RIGHT_TOP:
249 : : case style::GraphicLocation_RIGHT_MIDDLE:
250 : : case style::GraphicLocation_RIGHT_BOTTOM:
251 : : ePos = style::GraphicLocation_MIDDLE_TOP==eVert ?
252 : : style::GraphicLocation_RIGHT_TOP :
253 : : (style::GraphicLocation_MIDDLE_MIDDLE==eVert ?
254 : : style::GraphicLocation_RIGHT_MIDDLE :
255 [ # # ][ # # ]: 0 : style::GraphicLocation_RIGHT_BOTTOM);
256 : 0 : break;
257 : : default:
258 : 0 : break;
259 : : }
260 : 0 : }
261 : :
262 : 0 : void XMLBackGraphicPositionPropHdl::MergeXMLHoriPos( style::GraphicLocation& ePos, style::GraphicLocation eHori ) const
263 : : {
264 : : DBG_ASSERT( style::GraphicLocation_LEFT_MIDDLE==eHori || style::GraphicLocation_MIDDLE_MIDDLE==eHori || style::GraphicLocation_RIGHT_MIDDLE==eHori,
265 : : "lcl_frmitems_MergeXMLHoriPos: vertical pos must be middle" );
266 : :
267 [ # # # # ]: 0 : switch( ePos )
268 : : {
269 : : case style::GraphicLocation_LEFT_TOP:
270 : : case style::GraphicLocation_MIDDLE_TOP:
271 : : case style::GraphicLocation_RIGHT_TOP:
272 : : ePos = style::GraphicLocation_LEFT_MIDDLE==eHori ?
273 : : style::GraphicLocation_LEFT_TOP :
274 : : (style::GraphicLocation_MIDDLE_MIDDLE==eHori ?
275 : : style::GraphicLocation_MIDDLE_TOP :
276 [ # # ][ # # ]: 0 : style::GraphicLocation_RIGHT_TOP);
277 : 0 : break;
278 : :
279 : : case style::GraphicLocation_LEFT_MIDDLE:
280 : : case style::GraphicLocation_MIDDLE_MIDDLE:
281 : : case style::GraphicLocation_RIGHT_MIDDLE:
282 : 0 : ePos = eHori;
283 : 0 : break;
284 : :
285 : : case style::GraphicLocation_LEFT_BOTTOM:
286 : : case style::GraphicLocation_MIDDLE_BOTTOM:
287 : : case style::GraphicLocation_RIGHT_BOTTOM:
288 : : ePos = style::GraphicLocation_LEFT_MIDDLE==eHori ?
289 : : style::GraphicLocation_LEFT_BOTTOM :
290 : : (style::GraphicLocation_MIDDLE_MIDDLE==eHori ?
291 : : style::GraphicLocation_MIDDLE_BOTTOM :
292 [ # # ][ # # ]: 0 : style::GraphicLocation_RIGHT_BOTTOM);
293 : 0 : break;
294 : : default:
295 : 0 : break;
296 : : }
297 : 0 : }
298 : :
299 : : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|