| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_xmloff.hxx" |
| #include <tools/debug.hxx> |
| #include <backhdl.hxx> |
| #include <xmloff/xmltoken.hxx> |
| #include <xmloff/xmluconv.hxx> |
| #include <com/sun/star/uno/Any.hxx> |
| #include <rtl/ustrbuf.hxx> |
| |
| using ::rtl::OUString; |
| using ::rtl::OUStringBuffer; |
| |
| using namespace ::com::sun::star; |
| using namespace ::xmloff::token; |
| |
| SvXMLEnumMapEntry pXML_BrushHorizontalPos[] = |
| { |
| { XML_LEFT, style::GraphicLocation_LEFT_MIDDLE }, |
| { XML_RIGHT, style::GraphicLocation_RIGHT_MIDDLE }, |
| { XML_TOKEN_INVALID, 0 } |
| }; |
| |
| SvXMLEnumMapEntry pXML_BrushVerticalPos[] = |
| { |
| { XML_TOP, style::GraphicLocation_MIDDLE_TOP }, |
| { XML_BOTTOM, style::GraphicLocation_MIDDLE_BOTTOM }, |
| { XML_TOKEN_INVALID, 0 } |
| }; |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // class XMLBackGraphicPositionPropHdl |
| // |
| |
| XMLBackGraphicPositionPropHdl::~XMLBackGraphicPositionPropHdl() |
| { |
| // Nothing to do |
| } |
| |
| sal_Bool XMLBackGraphicPositionPropHdl::importXML( const OUString& rStrImpValue, uno::Any& rValue, const SvXMLUnitConverter& ) const |
| { |
| sal_Bool bRet = sal_True; |
| style::GraphicLocation ePos = style::GraphicLocation_NONE, eTmp; |
| sal_uInt16 nTmp; |
| SvXMLTokenEnumerator aTokenEnum( rStrImpValue ); |
| OUString aToken; |
| sal_Bool bHori = sal_False, bVert = sal_False; |
| |
| while( bRet && aTokenEnum.getNextToken( aToken ) ) |
| { |
| if( bHori && bVert ) |
| { |
| bRet = sal_False; |
| } |
| else if( -1 != aToken.indexOf( sal_Unicode('%') ) ) |
| { |
| sal_Int32 nPrc = 50; |
| if( SvXMLUnitConverter::convertPercent( nPrc, aToken ) ) |
| { |
| if( !bHori ) |
| { |
| ePos = nPrc < 25 ? style::GraphicLocation_LEFT_TOP : |
| (nPrc < 75 ? style::GraphicLocation_MIDDLE_MIDDLE : |
| style::GraphicLocation_RIGHT_BOTTOM); |
| bHori = sal_True; |
| } |
| else |
| { |
| eTmp = nPrc < 25 ? style::GraphicLocation_LEFT_TOP: |
| (nPrc < 75 ? style::GraphicLocation_LEFT_MIDDLE : |
| style::GraphicLocation_LEFT_BOTTOM); |
| MergeXMLVertPos( ePos, eTmp ); |
| bVert = sal_True; |
| } |
| } |
| else |
| { |
| // wrong percentage |
| bRet = sal_False; |
| } |
| } |
| else if( IsXMLToken( aToken, XML_CENTER ) ) |
| { |
| if( bHori ) |
| MergeXMLVertPos( ePos, style::GraphicLocation_MIDDLE_MIDDLE ); |
| else if ( bVert ) |
| MergeXMLHoriPos( ePos, style::GraphicLocation_MIDDLE_MIDDLE ); |
| else |
| ePos = style::GraphicLocation_MIDDLE_MIDDLE; |
| } |
| else if( SvXMLUnitConverter::convertEnum( nTmp, aToken, pXML_BrushHorizontalPos ) ) |
| { |
| if( bVert ) |
| MergeXMLHoriPos( ePos, (style::GraphicLocation)nTmp ); |
| else if( !bHori ) |
| ePos = (style::GraphicLocation)nTmp; |
| else |
| bRet = sal_False; |
| |
| bHori = sal_True; |
| } |
| else if( SvXMLUnitConverter::convertEnum( nTmp, aToken, pXML_BrushVerticalPos ) ) |
| { |
| if( bHori ) |
| MergeXMLVertPos( ePos, (style::GraphicLocation)nTmp ); |
| else if( !bVert ) |
| ePos = (style::GraphicLocation)nTmp; |
| else |
| bRet = sal_False; |
| bVert = sal_True; |
| } |
| else |
| { |
| bRet = sal_False; |
| } |
| } |
| |
| bRet &= style::GraphicLocation_NONE != ePos; |
| if( bRet ) |
| rValue <<= (style::GraphicLocation)(sal_uInt16)ePos; |
| |
| return bRet; |
| } |
| |
| sal_Bool XMLBackGraphicPositionPropHdl::exportXML( OUString& rStrExpValue, const uno::Any& rValue, const SvXMLUnitConverter& ) const |
| { |
| sal_Bool bRet = sal_True; |
| OUStringBuffer aOut; |
| |
| style::GraphicLocation eLocation; |
| if( !( rValue >>= eLocation ) ) |
| { |
| sal_Int32 nValue = 0; |
| if( rValue >>= nValue ) |
| eLocation = (style::GraphicLocation)nValue; |
| else |
| bRet = sal_False; |
| } |
| |
| if( bRet ) |
| { |
| bRet = sal_False; |
| |
| switch( eLocation ) |
| { |
| case style::GraphicLocation_LEFT_TOP: |
| case style::GraphicLocation_MIDDLE_TOP: |
| case style::GraphicLocation_RIGHT_TOP: |
| aOut.append( GetXMLToken(XML_TOP) ); |
| bRet = sal_True; |
| break; |
| case style::GraphicLocation_LEFT_MIDDLE: |
| case style::GraphicLocation_MIDDLE_MIDDLE: |
| case style::GraphicLocation_RIGHT_MIDDLE: |
| aOut.append( GetXMLToken(XML_CENTER) ); |
| bRet = sal_True; |
| break; |
| case style::GraphicLocation_LEFT_BOTTOM: |
| case style::GraphicLocation_MIDDLE_BOTTOM: |
| case style::GraphicLocation_RIGHT_BOTTOM: |
| aOut.append( GetXMLToken(XML_BOTTOM) ); |
| bRet = sal_True; |
| break; |
| default: |
| break; |
| } |
| |
| if( bRet ) |
| { |
| aOut.append( sal_Unicode( ' ' ) ); |
| |
| switch( eLocation ) |
| { |
| case style::GraphicLocation_LEFT_TOP: |
| case style::GraphicLocation_LEFT_BOTTOM: |
| case style::GraphicLocation_LEFT_MIDDLE: |
| aOut.append( GetXMLToken(XML_LEFT) ); |
| break; |
| case style::GraphicLocation_MIDDLE_TOP: |
| case style::GraphicLocation_MIDDLE_MIDDLE: |
| case style::GraphicLocation_MIDDLE_BOTTOM: |
| aOut.append( GetXMLToken(XML_CENTER) ); |
| break; |
| case style::GraphicLocation_RIGHT_MIDDLE: |
| case style::GraphicLocation_RIGHT_TOP: |
| case style::GraphicLocation_RIGHT_BOTTOM: |
| aOut.append( GetXMLToken(XML_RIGHT) ); |
| break; |
| default: |
| break; |
| } |
| } |
| } |
| |
| rStrExpValue = aOut.makeStringAndClear(); |
| |
| return bRet; |
| } |
| |
| void XMLBackGraphicPositionPropHdl::MergeXMLVertPos( style::GraphicLocation& ePos, style::GraphicLocation eVert ) const |
| { |
| switch( ePos ) |
| { |
| case style::GraphicLocation_LEFT_TOP: |
| case style::GraphicLocation_LEFT_MIDDLE: |
| case style::GraphicLocation_LEFT_BOTTOM: |
| ePos = style::GraphicLocation_MIDDLE_TOP==eVert ? |
| style::GraphicLocation_LEFT_TOP : |
| (style::GraphicLocation_MIDDLE_MIDDLE==eVert ? |
| style::GraphicLocation_LEFT_MIDDLE : |
| style::GraphicLocation_LEFT_BOTTOM); |
| ePos = eVert; |
| break; |
| |
| case style::GraphicLocation_MIDDLE_TOP: |
| case style::GraphicLocation_MIDDLE_MIDDLE: |
| case style::GraphicLocation_MIDDLE_BOTTOM: |
| ePos = eVert; |
| break; |
| |
| case style::GraphicLocation_RIGHT_TOP: |
| case style::GraphicLocation_RIGHT_MIDDLE: |
| case style::GraphicLocation_RIGHT_BOTTOM: |
| ePos = style::GraphicLocation_MIDDLE_TOP==eVert ? |
| style::GraphicLocation_RIGHT_TOP : |
| (style::GraphicLocation_MIDDLE_MIDDLE==eVert ? |
| style::GraphicLocation_RIGHT_MIDDLE : |
| style::GraphicLocation_RIGHT_BOTTOM); |
| break; |
| default: |
| break; |
| } |
| } |
| |
| void XMLBackGraphicPositionPropHdl::MergeXMLHoriPos( style::GraphicLocation& ePos, style::GraphicLocation eHori ) const |
| { |
| DBG_ASSERT( style::GraphicLocation_LEFT_MIDDLE==eHori || style::GraphicLocation_MIDDLE_MIDDLE==eHori || style::GraphicLocation_RIGHT_MIDDLE==eHori, |
| "lcl_frmitems_MergeXMLHoriPos: vertical pos must be middle" ); |
| |
| switch( ePos ) |
| { |
| case style::GraphicLocation_LEFT_TOP: |
| case style::GraphicLocation_MIDDLE_TOP: |
| case style::GraphicLocation_RIGHT_TOP: |
| ePos = style::GraphicLocation_LEFT_MIDDLE==eHori ? |
| style::GraphicLocation_LEFT_TOP : |
| (style::GraphicLocation_MIDDLE_MIDDLE==eHori ? |
| style::GraphicLocation_MIDDLE_TOP : |
| style::GraphicLocation_RIGHT_TOP); |
| break; |
| |
| case style::GraphicLocation_LEFT_MIDDLE: |
| case style::GraphicLocation_MIDDLE_MIDDLE: |
| case style::GraphicLocation_RIGHT_MIDDLE: |
| ePos = eHori; |
| break; |
| |
| case style::GraphicLocation_LEFT_BOTTOM: |
| case style::GraphicLocation_MIDDLE_BOTTOM: |
| case style::GraphicLocation_RIGHT_BOTTOM: |
| ePos = style::GraphicLocation_LEFT_MIDDLE==eHori ? |
| style::GraphicLocation_LEFT_BOTTOM : |
| (style::GraphicLocation_MIDDLE_MIDDLE==eHori ? |
| style::GraphicLocation_MIDDLE_BOTTOM : |
| style::GraphicLocation_RIGHT_BOTTOM); |
| break; |
| default: |
| break; |
| } |
| } |
| |