summaryrefslogtreecommitdiff
path: root/writerfilter/source/dmapper/PropertyMap.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'writerfilter/source/dmapper/PropertyMap.cxx')
-rw-r--r--writerfilter/source/dmapper/PropertyMap.cxx1269
1 files changed, 1269 insertions, 0 deletions
diff --git a/writerfilter/source/dmapper/PropertyMap.cxx b/writerfilter/source/dmapper/PropertyMap.cxx
new file mode 100644
index 000000000000..f8dcb0592cee
--- /dev/null
+++ b/writerfilter/source/dmapper/PropertyMap.cxx
@@ -0,0 +1,1269 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * Copyright 2000, 2010 Oracle and/or its affiliates.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org. If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+#include <PropertyMap.hxx>
+#include <ooxml/resourceids.hxx>
+#include <DomainMapper_Impl.hxx>
+#include <ConversionHelper.hxx>
+#include <i18npool/paper.hxx>
+#include <com/sun/star/beans/PropertyValue.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/table/BorderLine.hpp>
+#include <com/sun/star/container/XEnumeration.hpp>
+#include <com/sun/star/container/XEnumerationAccess.hpp>
+#include <com/sun/star/container/XNameContainer.hpp>
+#include <com/sun/star/style/BreakType.hpp>
+#include <com/sun/star/text/RelOrientation.hpp>
+#include <com/sun/star/text/WritingMode.hpp>
+#include <com/sun/star/text/XTextColumns.hpp>
+#include <com/sun/star/text/XText.hpp>
+#include <com/sun/star/text/TextGridMode.hpp>
+#include <com/sun/star/text/XTextCopy.hpp>
+#include "dmapperLoggers.hxx"
+#include "PropertyMapHelper.hxx"
+
+using namespace ::com::sun::star;
+
+namespace writerfilter {
+namespace dmapper{
+
+/*-- 21.06.2006 09:30:56---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+PropertyMap::PropertyMap() :
+ m_cFootnoteSymbol( 0 ),
+ m_nFootnoteFontId( -1 )
+{
+}
+/*-- 21.06.2006 09:30:56---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+PropertyMap::~PropertyMap()
+{
+}
+/*-- 20.06.2006 10:23:55---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Sequence< beans::PropertyValue > PropertyMap::GetPropertyValues()
+{
+ if(!m_aValues.getLength() && size())
+ {
+ m_aValues.realloc( size() );
+ ::com::sun::star::beans::PropertyValue* pValues = m_aValues.getArray();
+ //style names have to be the first elements within the property sequence
+ //otherwise they will overwrite 'hard' attributes
+ sal_Int32 nValue = 0;
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ PropertyMap::iterator aParaStyleIter = find(PropertyDefinition( PROP_PARA_STYLE_NAME, false ) );
+ if( aParaStyleIter != end())
+ {
+ pValues[nValue].Name = rPropNameSupplier.GetName( aParaStyleIter->first.eId );
+ pValues[nValue].Value = aParaStyleIter->second;
+ ++nValue;
+ }
+
+ PropertyMap::iterator aCharStyleIter = find(PropertyDefinition( PROP_CHAR_STYLE_NAME, false ));
+ if( aCharStyleIter != end())
+ {
+ pValues[nValue].Name = rPropNameSupplier.GetName( aCharStyleIter->first.eId );
+ pValues[nValue].Value = aCharStyleIter->second;
+ ++nValue;
+ }
+ PropertyMap::iterator aNumRuleIter = find(PropertyDefinition( PROP_NUMBERING_RULES, false ) );
+ if( aNumRuleIter != end())
+ {
+ pValues[nValue].Name = rPropNameSupplier.GetName( aNumRuleIter->first.eId );
+ pValues[nValue].Value = aNumRuleIter->second;
+ ++nValue;
+ }
+ PropertyMap::iterator aMapIter = begin();
+ for( ; nValue < m_aValues.getLength(); ++aMapIter )
+ {
+ if( aMapIter != aParaStyleIter && aMapIter != aCharStyleIter && aMapIter != aNumRuleIter )
+ {
+ pValues[nValue].Name = rPropNameSupplier.GetName( aMapIter->first.eId );
+ pValues[nValue].Value = aMapIter->second;
+ ++nValue;
+ }
+ }
+ }
+ return m_aValues;
+}
+
+void lcl_AnyToTag(XMLTag::Pointer_t pTag, const uno::Any & rAny)
+{
+ try {
+ sal_Int32 aInt = 0;
+ rAny >>= aInt;
+ pTag->addAttr("value", aInt);
+
+ sal_uInt32 auInt = 0;
+ rAny >>= auInt;
+ pTag->addAttr("unsignedValue", auInt);
+
+ float aFloat = 0.0f;
+ rAny >>= aFloat;
+ pTag->addAttr("floatValue", aFloat);
+
+ ::rtl::OUString aStr;
+ rAny >>= aStr;
+ pTag->addAttr("stringValue", aStr);
+ }
+ catch (...) {
+ }
+}
+
+void PropertyMap::Insert( PropertyIds eId, bool bIsTextProperty, const uno::Any& rAny, bool bOverwrite )
+{
+#ifdef DEBUG_DMAPPER_PROPERTY_MAP
+ const ::rtl::OUString& rInsert = PropertyNameSupplier::
+ GetPropertyNameSupplier().GetName(eId);
+
+ XMLTag::Pointer_t pTag(new XMLTag("propertyMap.insert"));
+ pTag->addAttr("name", rInsert);
+ lcl_AnyToTag(pTag, rAny);
+
+ dmapper_logger->addTag(pTag);
+#endif
+
+ PropertyMap::iterator aElement = find(PropertyDefinition( eId, bIsTextProperty ) );
+ if( aElement != end())
+ {
+ if(!bOverwrite)
+ return;
+ erase( aElement );
+ }
+ _PropertyMap::insert( PropertyMap::value_type
+ (PropertyDefinition( eId, bIsTextProperty),
+ rAny ));
+ Invalidate();
+}
+
+XMLTag::Pointer_t PropertyMap::toTag() const
+{
+ XMLTag::Pointer_t pResult(new XMLTag("PropertyMap"));
+
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ PropertyMap::const_iterator aMapIter = begin();
+ while (aMapIter != end())
+ {
+ XMLTag::Pointer_t pTag(new XMLTag("property"));
+
+ pTag->addAttr("name", rPropNameSupplier.GetName( aMapIter->first.eId ));
+
+ switch (aMapIter->first.eId)
+ {
+ case PROP_TABLE_COLUMN_SEPARATORS:
+ pTag->addTag(lcl_TableColumnSeparatorsToTag(aMapIter->second));
+ break;
+ default:
+ {
+ try {
+ sal_Int32 aInt = 0;
+ aMapIter->second >>= aInt;
+ pTag->addAttr("value", aInt);
+
+ sal_uInt32 auInt = 0;
+ aMapIter->second >>= auInt;
+ pTag->addAttr("unsignedValue", auInt);
+
+ float aFloat = 0.0;
+ aMapIter->second >>= aFloat;
+ pTag->addAttr("floatValue", aFloat);
+
+ ::rtl::OUString aStr;
+ aMapIter->second >>= auInt;
+ pTag->addAttr("stringValue", aStr);
+ }
+ catch (...) {
+ }
+ }
+ break;
+ }
+
+ pResult->addTag(pTag);
+
+ ++aMapIter;
+ }
+
+ return pResult;
+}
+
+/*-- 13.12.2006 10:46:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+template<class T>
+ struct removeExistingElements : public ::std::unary_function<T, void>
+{
+ PropertyMap& rMap;
+
+ removeExistingElements(PropertyMap& _rMap ) : rMap(_rMap) {}
+ void operator() (T x)
+ {
+ PropertyMap::iterator aElement = rMap.find(x.first);
+ if( aElement != rMap.end())
+ rMap.erase( aElement );
+ }
+};
+/*-- 13.12.2006 10:46:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void PropertyMap::insert( const PropertyMapPtr pMap, bool bOverwrite )
+{
+ if( pMap.get() )
+ {
+ if( bOverwrite )
+ ::std::for_each( pMap->begin(), pMap->end(), removeExistingElements<PropertyMap::value_type>(*this) );
+ _PropertyMap::insert(pMap->begin(), pMap->end());
+ insertTableProperties(pMap.get());
+
+ Invalidate();
+ }
+}
+/*-- 06.06.2007 15:49:09---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+const uno::Reference< text::XFootnote>& PropertyMap::GetFootnote() const
+{
+ return m_xFootnote;
+}
+/*-- 18.02.2008 11:23:28---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void PropertyMap::insertTableProperties( const PropertyMap* )
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->element("PropertyMap.insertTableProperties");
+#endif
+}
+/*-- 24.07.2006 08:29:01---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SectionPropertyMap::SectionPropertyMap(bool bIsFirstSection) :
+ m_bIsFirstSection( bIsFirstSection )
+ ,m_nBorderParams( 0 )
+ ,m_bTitlePage( false )
+ ,m_nColumnCount( 0 )
+ ,m_nColumnDistance( 1249 )
+ ,m_bSeparatorLineIsOn( false )
+ ,m_bEvenlySpaced( false )
+ ,m_bIsLandscape( false )
+ ,m_bPageNoRestart( false )
+ ,m_nPageNumber( -1 )
+ ,m_nBreakType( -1 )
+ ,m_nPaperBin( -1 )
+ ,m_nFirstPaperBin( -1 )
+ ,m_nLeftMargin( 3175 ) //page left margin, default 0x708 (1800) twip -> 3175 1/100 mm
+ ,m_nRightMargin( 3175 )//page right margin, default 0x708 (1800) twip -> 3175 1/100 mm
+ ,m_nTopMargin( 2540 )
+ ,m_nBottomMargin( 2540 )
+ ,m_nHeaderTop( 1270 ) //720 twip
+ ,m_nHeaderBottom( 1270 )//720 twip
+ ,m_nDzaGutter( 0 )
+ ,m_bGutterRTL( false )
+ ,m_bSFBiDi( false )
+ ,m_nGridType(0)
+ ,m_nGridLinePitch( 1 )
+ ,m_nDxtCharSpace( 0 )
+ ,m_nLnnMod( 0 )
+ ,m_nLnc( 0 )
+ ,m_ndxaLnn( 0 )
+ ,m_nLnnMin( 0 )
+{
+ static sal_Int32 nNumber = 0;
+ nSectionNumber = nNumber++;
+ memset(&m_pBorderLines, 0x00, sizeof(m_pBorderLines));
+ for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder )
+ m_nBorderDistances[ nBorder ] = -1;
+ //todo: set defaults in ApplyPropertiesToPageStyles
+ //initialize defaults
+ PaperInfo aLetter(PAPER_LETTER);
+ //page height, 1/100mm
+ Insert( PROP_HEIGHT, false, uno::makeAny( (sal_Int32) aLetter.getHeight() ) );
+ //page width, 1/100mm
+ Insert( PROP_WIDTH, false, uno::makeAny( (sal_Int32) aLetter.getWidth() ) );
+ //page left margin, default 0x708 (1800) twip -> 3175 1/100 mm
+ Insert( PROP_LEFT_MARGIN, false, uno::makeAny( (sal_Int32) 3175 ) );
+ //page right margin, default 0x708 (1800) twip -> 3175 1/100 mm
+ Insert( PROP_RIGHT_MARGIN, false, uno::makeAny( (sal_Int32) 3175 ) );
+ //page top margin, default 0x5a0 (1440) twip -> 2540 1/100 mm
+ Insert( PROP_TOP_MARGIN, false, uno::makeAny( (sal_Int32)2540 ) );
+ //page bottom margin, default 0x5a0 (1440) twip -> 2540 1/100 mm
+ Insert( PROP_BOTTOM_MARGIN, false, uno::makeAny( (sal_Int32) 2540 ) );
+ uno::Any aFalse( ::uno::makeAny( false ) );
+ Insert( PROP_GRID_DISPLAY, false, aFalse);
+ Insert( PROP_GRID_PRINT, false, aFalse);
+ Insert( PROP_GRID_MODE, false, uno::makeAny(text::TextGridMode::NONE));
+
+
+ if( m_bIsFirstSection )
+ {
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ m_sFirstPageStyleName = rPropNameSupplier.GetName( PROP_FIRST_PAGE );
+ m_sFollowPageStyleName = rPropNameSupplier.GetName( PROP_STANDARD );
+ }
+}
+/*-- 24.07.2006 08:29:02---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+SectionPropertyMap::~SectionPropertyMap()
+{
+ for( sal_Int16 ePos = BORDER_LEFT; ePos <= BORDER_BOTTOM; ++ePos)
+ delete m_pBorderLines[ePos];
+}
+/*-- 24.07.2006 08:31:07---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+const ::rtl::OUString& SectionPropertyMap::GetPageStyleName( bool bFirst )
+{
+ return bFirst ? m_sFirstPageStyleName : m_sFollowPageStyleName;
+}
+/*-- 24.07.2006 08:31:07---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::SetPageStyleName( bool bFirst, const ::rtl::OUString& rName)
+{
+ if( bFirst )
+ m_sFirstPageStyleName = rName;
+ else
+ m_sFollowPageStyleName = rName;
+}
+/*-- 24.07.2006 09:41:20---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+::rtl::OUString lcl_FindUnusedPageStyleName(const uno::Sequence< ::rtl::OUString >& rPageStyleNames)
+{
+ static const sal_Char cDefaultStyle[] = "Converted";
+ //find the hightest number x in each style with the name "cDefaultStyle+x" and
+ //return an incremented name
+ sal_Int32 nMaxIndex = 0;
+ const sal_Int32 nDefaultLength = sizeof(cDefaultStyle)/sizeof(sal_Char) - 1;
+ const ::rtl::OUString sDefaultStyle( cDefaultStyle, nDefaultLength, RTL_TEXTENCODING_ASCII_US );
+
+ const ::rtl::OUString* pStyleNames = rPageStyleNames.getConstArray();
+ for( sal_Int32 nStyle = 0; nStyle < rPageStyleNames.getLength(); ++nStyle)
+ {
+ if( pStyleNames[nStyle].getLength() > nDefaultLength &&
+ !rtl_ustr_compare_WithLength( sDefaultStyle, nDefaultLength, pStyleNames[nStyle], nDefaultLength))
+ {
+ sal_Int32 nIndex = pStyleNames[nStyle].copy( nDefaultLength ).toInt32();
+ if( nIndex > nMaxIndex)
+ nMaxIndex = nIndex;
+ }
+ }
+ ::rtl::OUString sRet( sDefaultStyle );
+ sRet += rtl::OUString::valueOf( nMaxIndex + 1);
+ return sRet;
+}
+
+/*-- 28.07.2006 13:00:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< beans::XPropertySet > SectionPropertyMap::GetPageStyle(
+ const uno::Reference< container::XNameContainer >& xPageStyles,
+ const uno::Reference < lang::XMultiServiceFactory >& xTextFactory,
+ bool bFirst )
+{
+ uno::Reference< beans::XPropertySet > xRet;
+ try
+ {
+ if( bFirst )
+ {
+ if( !m_sFirstPageStyleName.getLength() )
+ {
+ uno::Sequence< ::rtl::OUString > aPageStyleNames = xPageStyles->getElementNames();
+ m_sFirstPageStyleName = lcl_FindUnusedPageStyleName(aPageStyleNames);
+ m_aFirstPageStyle = uno::Reference< beans::XPropertySet > (
+ xTextFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.PageStyle") )),
+ uno::UNO_QUERY);
+ xPageStyles->insertByName( m_sFirstPageStyleName, uno::makeAny(m_aFirstPageStyle) );
+ }
+ else if( !m_aFirstPageStyle.is() )
+ {
+ xPageStyles->getByName(m_sFirstPageStyleName) >>= m_aFirstPageStyle;
+ }
+ xRet = m_aFirstPageStyle;
+ }
+ else
+ {
+ if( !m_sFollowPageStyleName.getLength() )
+ {
+ uno::Sequence< ::rtl::OUString > aPageStyleNames = xPageStyles->getElementNames();
+ m_sFollowPageStyleName = lcl_FindUnusedPageStyleName(aPageStyleNames);
+ m_aFollowPageStyle = uno::Reference< beans::XPropertySet > (
+ xTextFactory->createInstance(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.style.PageStyle") )),
+ uno::UNO_QUERY);
+ xPageStyles->insertByName( m_sFollowPageStyleName, uno::makeAny(m_aFollowPageStyle) );
+ }
+ else if(!m_aFollowPageStyle.is() )
+ {
+ xPageStyles->getByName(m_sFollowPageStyleName) >>= m_aFollowPageStyle;
+ }
+ xRet = m_aFollowPageStyle;
+ }
+
+ }
+ catch( const uno::Exception& )
+ {
+ }
+
+ return xRet;
+}
+/*-- 28.07.2006 10:56:26---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const table::BorderLine& rBorderLine )
+{
+ delete m_pBorderLines[ePos];
+ m_pBorderLines[ePos] = new table::BorderLine( rBorderLine );
+ m_nBorderDistances[ePos] = nLineDistance;
+}
+/*-- 28.07.2006 10:56:27---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::ApplyBorderToPageStyles(
+ const uno::Reference< container::XNameContainer >& xPageStyles,
+ const uno::Reference < lang::XMultiServiceFactory >& xTextFactory,
+ sal_Int32 nValue )
+{
+ /*
+ page border applies to:
+ nIntValue & 0x07 ->
+ 0 all pages in this section
+ 1 first page in this section
+ 2 all pages in this section but first
+ 3 whole document (all sections)
+ nIntValue & 0x18 -> page border depth 0 - in front 1- in back
+ nIntValue & 0xe0 ->
+ page border offset from:
+ 0 offset from text
+ 1 offset from edge of page
+ */
+ uno::Reference< beans::XPropertySet > xFirst;
+ uno::Reference< beans::XPropertySet > xSecond;
+ sal_Int32 nOffsetFrom = (nValue & 0x00E0) >> 5;
+ //sal_Int32 bPageDepth = (nValue & 0x0018) >> 3; //unused infromation: 0 - in front 1 - in back
+ //todo: negative spacing (from ww8par6.cxx)
+ switch( nValue & 0x07)
+ {
+ case 0: /*all styles*/
+ if ( m_sFollowPageStyleName.getLength( ) > 0 )
+ xFirst = GetPageStyle( xPageStyles, xTextFactory, false );
+ if ( m_sFirstPageStyleName.getLength( ) > 0 )
+ xSecond = GetPageStyle( xPageStyles, xTextFactory, true );
+ break;
+ case 1: /*first page*/
+ if ( m_sFirstPageStyleName.getLength( ) > 0 )
+ xFirst = GetPageStyle( xPageStyles, xTextFactory, true );
+ break;
+ case 2: /*left and right*/
+ if ( m_sFollowPageStyleName.getLength( ) > 0 )
+ xFirst = GetPageStyle( xPageStyles, xTextFactory, false );
+ break;
+ case 3: //whole document?
+ //todo: how to apply a border to the whole document - find all sections or access all page styles?
+ default:
+ return;
+ }
+ //has to be sorted like enum BorderPosition: l-r-t-b
+ static const PropertyIds aBorderIds[4] =
+ {
+ PROP_LEFT_BORDER,
+ PROP_RIGHT_BORDER,
+ PROP_TOP_BORDER,
+ PROP_BOTTOM_BORDER
+ };
+ static const PropertyIds aBorderDistanceIds[4] =
+ {
+ PROP_LEFT_BORDER_DISTANCE,
+ PROP_RIGHT_BORDER_DISTANCE,
+ PROP_TOP_BORDER_DISTANCE,
+ PROP_BOTTOM_BORDER_DISTANCE
+ };
+ static const PropertyIds aMarginIds[4] =
+ {
+ PROP_LEFT_MARGIN,
+ PROP_RIGHT_MARGIN,
+ PROP_TOP_MARGIN,
+ PROP_BOTTOM_MARGIN
+ };
+
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ for( sal_Int32 nBorder = 0; nBorder < 4; ++nBorder)
+ {
+ if( m_pBorderLines[nBorder] )
+ {
+ const ::rtl::OUString sBorderName = rPropNameSupplier.GetName( aBorderIds[nBorder] );
+ xFirst->setPropertyValue( sBorderName, uno::makeAny( *m_pBorderLines[nBorder] ));
+ if(xSecond.is())
+ xSecond->setPropertyValue( sBorderName, uno::makeAny( *m_pBorderLines[nBorder] ));
+ }
+ if( m_nBorderDistances[nBorder] >= 0 )
+ {
+ SetBorderDistance( xFirst, aMarginIds[nBorder], aBorderDistanceIds[nBorder],
+ m_nBorderDistances[nBorder], nOffsetFrom );
+ if(xSecond.is())
+ SetBorderDistance( xSecond, aMarginIds[nBorder], aBorderDistanceIds[nBorder],
+ m_nBorderDistances[nBorder], nOffsetFrom );
+ }
+ }
+}
+
+void SectionPropertyMap::SetBorderDistance( uno::Reference< beans::XPropertySet > xStyle,
+ PropertyIds eMarginId, PropertyIds eDistId, sal_Int32 nDistance, sal_Int32 nOffsetFrom )
+{
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+
+ sal_Int32 nDist = nDistance;
+ if( nOffsetFrom == 1 )
+ {
+ const ::rtl::OUString sMarginName = rPropNameSupplier.GetName( eMarginId );
+ uno::Any aMargin = xStyle->getPropertyValue( sMarginName );
+ sal_Int32 nMargin = 0;
+ aMargin >>= nMargin;
+
+ // Change the margins with the border distance
+ xStyle->setPropertyValue( sMarginName, uno::makeAny( nDistance ) );
+
+ // Set the distance to ( Margin - distance )
+ nDist = nMargin - nDistance;
+ }
+ const ::rtl::OUString sBorderDistanceName = rPropNameSupplier.GetName( eDistId );
+ xStyle->setPropertyValue( sBorderDistanceName, uno::makeAny( nDist ));
+}
+
+/*-- 14.12.2006 12:50:06---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+uno::Reference< text::XTextColumns > SectionPropertyMap::ApplyColumnProperties(
+ uno::Reference< beans::XPropertySet > xColumnContainer )
+{
+ uno::Reference< text::XTextColumns > xColumns;
+ try
+ {
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ const ::rtl::OUString sTextColumns = rPropNameSupplier.GetName( PROP_TEXT_COLUMNS );
+ xColumnContainer->getPropertyValue(sTextColumns) >>= xColumns;
+ uno::Reference< beans::XPropertySet > xColumnPropSet( xColumns, uno::UNO_QUERY_THROW );
+ if( !m_bEvenlySpaced &&
+ (sal_Int32(m_aColWidth.size()) == (m_nColumnCount + 1 )) &&
+ (sal_Int32(m_aColDistance.size()) == m_nColumnCount))
+ {
+ //the column width in word is an absolute value, in OOo it's relative
+ //the distances are both absolute
+ sal_Int32 nColSum = 0;
+ for( sal_Int32 nCol = 0; nCol <= m_nColumnCount; ++nCol)
+ {
+ nColSum += m_aColWidth[nCol];
+ if(nCol)
+ nColSum += m_aColDistance[nCol -1];
+ }
+
+ sal_Int32 nRefValue = xColumns->getReferenceValue();
+ double fRel = double( nRefValue ) / double( nColSum );
+ uno::Sequence< text::TextColumn > aColumns( m_nColumnCount + 1 );
+ text::TextColumn* pColumn = aColumns.getArray();
+
+ nColSum = 0;
+ for( sal_Int32 nCol = 0; nCol <= m_nColumnCount; ++nCol)
+ {
+ //nColSum : nRefValue == (nAbsColWidth + colDist /2) : nRelColWidth;
+ pColumn[nCol].LeftMargin = nCol ? m_aColDistance[nCol - 1 ] / 2 : 0;
+ pColumn[nCol].RightMargin = nCol == m_nColumnCount ? 0 : m_aColDistance[nCol] / 2;
+ pColumn[nCol].Width = sal_Int32((double( m_aColWidth[nCol] + pColumn[nCol].RightMargin + pColumn[nCol].LeftMargin ) + 0.5 ) * fRel );
+ nColSum += pColumn[nCol].Width;
+ }
+ if( nColSum != nRefValue )
+ pColumn[m_nColumnCount].Width -= ( nColSum - nRefValue );
+ xColumns->setColumns( aColumns );
+ }
+ else
+ {
+ xColumns->setColumnCount( m_nColumnCount + 1 );
+ xColumnPropSet->setPropertyValue( rPropNameSupplier.GetName( PROP_AUTOMATIC_DISTANCE ), uno::makeAny( m_nColumnDistance ));
+ }
+
+ if(m_bSeparatorLineIsOn)
+ xColumnPropSet->setPropertyValue(
+ rPropNameSupplier.GetName( PROP_SEPARATOR_LINE_IS_ON ),
+ uno::makeAny( m_bSeparatorLineIsOn ));
+ xColumnContainer->setPropertyValue( sTextColumns, uno::makeAny( xColumns ) );
+ }
+ catch( const uno::Exception& )
+ {
+ OSL_ENSURE( false, "Exception in SectionPropertyMap::ApplyColumnProperties");
+ }
+ return xColumns;
+}
+
+/*-- 20.12.2006 09:44:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+bool SectionPropertyMap::HasHeader(bool bFirstPage) const
+{
+ bool bRet = false;
+ if( (bFirstPage && m_aFirstPageStyle.is()) ||( !bFirstPage && m_aFollowPageStyle.is()) )
+ {
+ if( bFirstPage )
+ m_aFirstPageStyle->getPropertyValue(
+ PropertyNameSupplier::GetPropertyNameSupplier().GetName(PROP_HEADER_IS_ON) ) >>= bRet;
+ else
+ m_aFollowPageStyle->getPropertyValue(
+ PropertyNameSupplier::GetPropertyNameSupplier().GetName(PROP_HEADER_IS_ON) ) >>= bRet;
+ }
+ return bRet;
+}
+/*-- 20.12.2006 09:44:16---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+bool SectionPropertyMap::HasFooter(bool bFirstPage) const
+{
+ bool bRet = false;
+ if( (bFirstPage && m_aFirstPageStyle.is()) ||( !bFirstPage && m_aFollowPageStyle.is()) )
+ {
+ if( bFirstPage )
+ m_aFirstPageStyle->getPropertyValue(
+ PropertyNameSupplier::GetPropertyNameSupplier().GetName(PROP_FOOTER_IS_ON) ) >>= bRet;
+ else
+ m_aFollowPageStyle->getPropertyValue(
+ PropertyNameSupplier::GetPropertyNameSupplier().GetName(PROP_FOOTER_IS_ON) ) >>= bRet;
+ }
+ return bRet;
+}
+/*-- 20.12.2006 09:41:56---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+#define MIN_HEAD_FOOT_HEIGHT 100 //minimum header/footer height
+
+void SectionPropertyMap::CopyLastHeaderFooter( bool bFirstPage, DomainMapper_Impl& rDM_Impl )
+{
+#if DEBUG
+ clog << "START>>> SectionPropertyMap::CopyLastHeaderFooter()" << endl;
+#endif
+ SectionPropertyMap* pLastContext = rDM_Impl.GetLastSectionContext( );
+ if ( pLastContext )
+ {
+ uno::Reference< beans::XPropertySet > xPrevStyle = pLastContext->GetPageStyle(
+ rDM_Impl.GetPageStyles(),
+ rDM_Impl.GetTextFactory(),
+ bFirstPage );
+ uno::Reference< beans::XPropertySet > xStyle = GetPageStyle(
+ rDM_Impl.GetPageStyles(),
+ rDM_Impl.GetTextFactory(),
+ bFirstPage );
+
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+
+ try {
+ // Loop over the Header and Footer properties to copy them
+ static PropertyIds aProperties[] =
+ {
+ PROP_HEADER_TEXT,
+ PROP_FOOTER_TEXT,
+ };
+
+ bool bHasPrevHeader = false;
+ bool bHasHeader = false;
+
+ rtl::OUString sHeaderIsOn = rPropNameSupplier.GetName( PROP_HEADER_IS_ON );
+ xPrevStyle->getPropertyValue( sHeaderIsOn ) >>= bHasPrevHeader;
+ xStyle->getPropertyValue( sHeaderIsOn ) >>= bHasHeader;
+ bool bCopyHeader = bHasPrevHeader && !bHasHeader;
+
+ if ( bCopyHeader )
+ xStyle->setPropertyValue( sHeaderIsOn, uno::makeAny( sal_True ) );
+
+ bool bHasPrevFooter = false;
+ bool bHasFooter = false;
+
+ rtl::OUString sFooterIsOn = rPropNameSupplier.GetName( PROP_FOOTER_IS_ON );
+ xPrevStyle->getPropertyValue( sFooterIsOn ) >>= bHasPrevFooter;
+ xStyle->getPropertyValue( sFooterIsOn ) >>= bHasFooter;
+ bool bCopyFooter = bHasPrevFooter && !bHasFooter;
+
+ if ( bCopyFooter )
+ xStyle->setPropertyValue( sFooterIsOn, uno::makeAny( sal_True ) );
+
+ // Copying the text properties
+ for ( int i = 0, nNbProps = 2; i < nNbProps; i++ )
+ {
+ bool bIsHeader = ( i < nNbProps / 2 );
+ PropertyIds aPropId = aProperties[i];
+ rtl::OUString sName = rPropNameSupplier.GetName( aPropId );
+
+ if ( ( bIsHeader && bCopyHeader ) || ( !bIsHeader && bCopyFooter ) )
+ {
+#if DEBUG
+ clog << "Copying ";
+ clog << rtl::OUStringToOString( sName, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl;
+#endif
+ // TODO has to be copied
+ uno::Reference< text::XTextCopy > xTxt(
+ xStyle->getPropertyValue( sName ), uno::UNO_QUERY_THROW );
+
+ uno::Reference< text::XTextCopy > xPrevTxt(
+ xPrevStyle->getPropertyValue( sName ), uno::UNO_QUERY_THROW );
+
+ xTxt->copyText( xPrevTxt );
+ }
+ }
+ }
+ catch ( const uno::Exception& e )
+ {
+#if DEBUG
+ clog << "An exception occured in SectionPropertyMap::CopyLastHeaderFooter( ) - ";
+ clog << rtl::OUStringToOString( e.Message, RTL_TEXTENCODING_UTF8 ).getStr( ) << endl;
+#endif
+ }
+ }
+#if DEBUG
+ clog << "END>>> SectionPropertyMap::CopyLastHeaderFooter()" << endl;
+#endif
+}
+
+void SectionPropertyMap::PrepareHeaderFooterProperties( bool bFirstPage )
+{
+ sal_Int32 nTopMargin = m_nTopMargin;
+ if(HasHeader(bFirstPage))
+ {
+ m_nTopMargin = m_nHeaderTop;
+ if( nTopMargin > 0 && nTopMargin > m_nHeaderTop )
+ m_nHeaderTop = nTopMargin - m_nHeaderTop;
+ else
+ m_nHeaderTop = 0;
+
+ //minimum header height 1mm
+ if( m_nHeaderTop < MIN_HEAD_FOOT_HEIGHT )
+ m_nHeaderTop = MIN_HEAD_FOOT_HEIGHT;
+ }
+
+
+ if( nTopMargin >= 0 ) //fixed height header -> see WW8Par6.hxx
+ {
+ operator[]( PropertyDefinition( PROP_HEADER_IS_DYNAMIC_HEIGHT, false )) = uno::makeAny( true );
+ operator[]( PropertyDefinition( PROP_HEADER_DYNAMIC_SPACING, false )) = uno::makeAny( true );
+ operator[]( PropertyDefinition( PROP_HEADER_BODY_DISTANCE, false )) = uno::makeAny( m_nHeaderTop - MIN_HEAD_FOOT_HEIGHT );// ULSpace.Top()
+ operator[]( PropertyDefinition( PROP_HEADER_HEIGHT, false )) = uno::makeAny( m_nHeaderTop );
+
+ }
+ else
+ {
+ //todo: old filter fakes a frame into the header/footer to support overlapping
+ //current setting is completely wrong!
+ operator[]( PropertyDefinition( PROP_HEADER_HEIGHT, false )) = uno::makeAny( m_nHeaderTop );
+ operator[]( PropertyDefinition( PROP_HEADER_BODY_DISTANCE, false )) = uno::makeAny( nTopMargin - m_nHeaderTop );
+ operator[]( PropertyDefinition( PROP_HEADER_IS_DYNAMIC_HEIGHT, false)) = uno::makeAny( false );
+ operator[]( PropertyDefinition( PROP_HEADER_DYNAMIC_SPACING, false)) = uno::makeAny( false );
+ }
+
+ sal_Int32 nBottomMargin = m_nBottomMargin;
+ if( HasFooter( bFirstPage ) )
+ {
+ m_nBottomMargin = m_nHeaderBottom;
+ if( nBottomMargin > 0 && nBottomMargin > m_nHeaderBottom )
+ m_nHeaderBottom = nBottomMargin - m_nHeaderBottom;
+ else
+ m_nHeaderBottom = 0;
+ if( m_nHeaderBottom < MIN_HEAD_FOOT_HEIGHT )
+ m_nHeaderBottom = MIN_HEAD_FOOT_HEIGHT;
+ }
+
+ if( nBottomMargin >= 0 ) //fixed height footer -> see WW8Par6.hxx
+ {
+ operator[]( PropertyDefinition( PROP_FOOTER_IS_DYNAMIC_HEIGHT, false )) = uno::makeAny( true );
+ operator[]( PropertyDefinition( PROP_FOOTER_DYNAMIC_SPACING, false )) = uno::makeAny( true );
+ operator[]( PropertyDefinition( PROP_FOOTER_BODY_DISTANCE, false )) = uno::makeAny( m_nHeaderBottom - MIN_HEAD_FOOT_HEIGHT);
+ operator[]( PropertyDefinition( PROP_FOOTER_HEIGHT, false )) = uno::makeAny( m_nHeaderBottom );
+ }
+ else
+ {
+ //todo: old filter fakes a frame into the header/footer to support overlapping
+ //current setting is completely wrong!
+ operator[]( PropertyDefinition( PROP_FOOTER_IS_DYNAMIC_HEIGHT, false)) = uno::makeAny( false );
+ operator[]( PropertyDefinition( PROP_FOOTER_DYNAMIC_SPACING, false)) = uno::makeAny( false );
+ operator[]( PropertyDefinition( PROP_FOOTER_HEIGHT, false )) = uno::makeAny( nBottomMargin - m_nHeaderBottom );
+ operator[]( PropertyDefinition( PROP_FOOTER_BODY_DISTANCE, false )) = uno::makeAny( m_nHeaderBottom );
+ }
+
+ //now set the top/bottom margin for the follow page style
+ operator[]( PropertyDefinition( PROP_TOP_MARGIN, false )) = uno::makeAny( m_nTopMargin );
+ operator[]( PropertyDefinition( PROP_BOTTOM_MARGIN, false )) = uno::makeAny( m_nBottomMargin );
+}
+/*-- 11.12.2006 08:31:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::CloseSectionGroup( DomainMapper_Impl& rDM_Impl )
+{
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ if( m_nLnnMod )
+ {
+ bool bFirst = rDM_Impl.IsLineNumberingSet();
+ rDM_Impl.SetLineNumbering( m_nLnnMod, m_nLnc, m_ndxaLnn );
+ if( m_nLnnMin > 0 || (bFirst && m_nLnc == 1))
+ {
+ //set the starting value at the beginning of the section
+ try
+ {
+ uno::Reference< beans::XPropertySet > xRangeProperties;
+ if( m_xStartingRange.is() )
+ {
+ xRangeProperties = uno::Reference< beans::XPropertySet >( m_xStartingRange, uno::UNO_QUERY_THROW );
+ }
+ else
+ {
+ //set the start value at the beginning of the document
+ xRangeProperties = uno::Reference< beans::XPropertySet >( rDM_Impl.GetTextDocument()->getText()->getStart(), uno::UNO_QUERY_THROW );
+ }
+ xRangeProperties->setPropertyValue( rPropNameSupplier.GetName( PROP_PARA_LINE_NUMBER_START_VALUE ), uno::makeAny( m_nLnnMin + 1 ));
+ }
+ catch( const uno::Exception& )
+ {
+ OSL_ENSURE( false, "Exception in SectionPropertyMap::CloseSectionGroup");
+ }
+ }
+ }
+
+ //depending on the break type no page styles should be created
+ if(m_nBreakType == 0)
+ {
+ //todo: insert a section or access the already inserted section
+ //-->debug
+// ::rtl::OUString sSelection = m_xStartingRange->getString();
+// sSelection.getLength();
+ //-->debug
+ uno::Reference< beans::XPropertySet > xSection =
+ rDM_Impl.appendTextSectionAfter( m_xStartingRange );
+ if( m_nColumnCount > 0 && xSection.is())
+ ApplyColumnProperties( xSection );
+ }
+ else
+ {
+ //get the properties and create appropriate page styles
+ uno::Reference< beans::XPropertySet > xFollowPageStyle = GetPageStyle( rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), false );
+
+ if( m_nDzaGutter > 0 )
+ {
+ //todo: iGutterPos from DocProperties are missing
+ // if( m_iGutterPos > 0 ) m_nTopMargin += m_nDzaGutter; else
+ if( m_bGutterRTL )
+ m_nRightMargin += m_nDzaGutter;
+ else
+ m_nLeftMargin += m_nDzaGutter;
+ }
+ operator[]( PropertyDefinition( PROP_LEFT_MARGIN, false )) = uno::makeAny( m_nLeftMargin );
+ operator[]( PropertyDefinition( PROP_RIGHT_MARGIN, false )) = uno::makeAny( m_nRightMargin );
+
+// if( iGutterPos && fRTLGutter )
+// m_nTopMargin += nGutter
+
+ /*** if headers/footers are available then the top/bottom margins of the
+ header/footer are copied to the top/bottom margin of the page
+ */
+ CopyLastHeaderFooter( false, rDM_Impl );
+ PrepareHeaderFooterProperties( false );
+
+ const ::rtl::OUString sTrayIndex = rPropNameSupplier.GetName( PROP_PRINTER_PAPER_TRAY_INDEX );
+ if( m_nPaperBin >= 0 )
+ xFollowPageStyle->setPropertyValue( sTrayIndex, uno::makeAny( m_nPaperBin ) );
+ uno::Reference< text::XTextColumns > xColumns;
+ if( m_nColumnCount > 0 )
+ xColumns = ApplyColumnProperties( xFollowPageStyle );
+
+ //prepare text grid properties
+ sal_Int32 nHeight = 1;
+ PropertyMap::iterator aElement = find(PropertyDefinition( PROP_HEIGHT, false ));
+ if( aElement != end())
+ aElement->second >>= nHeight;
+
+ sal_Int32 nWidth = 1;
+ aElement = find(PropertyDefinition( PROP_WIDTH, false ));
+ if( aElement != end())
+ aElement->second >>= nWidth;
+
+ text::WritingMode eWritingMode = text::WritingMode_LR_TB;
+ aElement = find(PropertyDefinition( PROP_WRITING_MODE, false ));
+ if( aElement != end())
+ aElement->second >>= eWritingMode;
+
+
+
+ sal_Int32 nTextAreaHeight = eWritingMode == text::WritingMode_LR_TB ?
+ nHeight - m_nTopMargin - m_nBottomMargin :
+ nWidth - m_nLeftMargin - m_nRightMargin;
+
+ operator[]( PropertyDefinition( PROP_GRID_LINES, false )) =
+ uno::makeAny( static_cast<sal_Int16>(nTextAreaHeight/m_nGridLinePitch));
+
+ sal_Int32 nCharWidth = 423; //240 twip/ 12 pt
+ //todo: is '0' the right index here?
+ const StyleSheetEntryPtr pEntry = rDM_Impl.GetStyleSheetTable()->FindStyleSheetByISTD(::rtl::OUString::valueOf(static_cast<sal_Int32>(0), 16));
+ if( pEntry.get( ) )
+ {
+ PropertyMap::iterator aElement_ = pEntry->pProperties->find(PropertyDefinition( PROP_CHAR_HEIGHT_ASIAN, false ));
+ if( aElement_ != pEntry->pProperties->end())
+ {
+ double fHeight = 0;
+ if( aElement_->second >>= fHeight )
+ nCharWidth = ConversionHelper::convertTwipToMM100( (long)( fHeight * 20.0 + 0.5 ));
+ }
+ }
+
+ //dxtCharSpace
+ if(m_nDxtCharSpace)
+ {
+ sal_Int32 nCharSpace = m_nDxtCharSpace;
+ //main lives in top 20 bits, and is signed.
+ sal_Int32 nMain = (nCharSpace & 0xFFFFF000);
+ nMain /= 0x1000;
+ nCharWidth += ConversionHelper::convertTwipToMM100( nMain * 20 );
+
+ sal_Int32 nFraction = (nCharSpace & 0x00000FFF);
+ nFraction = (nFraction * 20)/0xFFF;
+ nCharWidth += ConversionHelper::convertTwipToMM100( nFraction );
+ }
+ operator[]( PropertyDefinition( PROP_GRID_BASE_HEIGHT, false )) = uno::makeAny( nCharWidth );
+ sal_Int32 nRubyHeight = m_nGridLinePitch - nCharWidth;
+ if(nRubyHeight < 0 )
+ nRubyHeight = 0;
+ operator[]( PropertyDefinition( PROP_GRID_RUBY_HEIGHT, false )) = uno::makeAny( nRubyHeight );
+
+ sal_Int16 nGridMode = text::TextGridMode::NONE;
+
+ switch (m_nGridType)
+ {
+ case NS_ooxml::LN_Value_wordprocessingml_ST_DocGrid_lines:
+ nGridMode = text::TextGridMode::LINES;
+ break;
+ case NS_ooxml::LN_Value_wordprocessingml_ST_DocGrid_linesAndChars:
+ nGridMode = text::TextGridMode::LINES_AND_CHARS;
+ break;
+ default:
+ break;
+ }
+
+ operator[](PropertyDefinition(PROP_GRID_MODE, false)) = uno::makeAny(nGridMode);
+
+ _ApplyProperties( xFollowPageStyle );
+
+ //todo: creating a "First Page" style depends on HasTitlePage und _fFacingPage_
+ if( m_bTitlePage )
+ {
+ CopyLastHeaderFooter( true, rDM_Impl );
+ PrepareHeaderFooterProperties( true );
+ uno::Reference< beans::XPropertySet > xFirstPageStyle = GetPageStyle(
+ rDM_Impl.GetPageStyles(), rDM_Impl.GetTextFactory(), true );
+ _ApplyProperties( xFirstPageStyle );
+
+ sal_Int32 nPaperBin = m_nFirstPaperBin >= 0 ? m_nFirstPaperBin : m_nPaperBin >= 0 ? m_nPaperBin : 0;
+ if( nPaperBin )
+ xFollowPageStyle->setPropertyValue( sTrayIndex, uno::makeAny( nPaperBin ) );
+ if( xColumns.is() )
+ xFollowPageStyle->setPropertyValue(
+ rPropNameSupplier.GetName( PROP_TEXT_COLUMNS ), uno::makeAny( xColumns ));
+ }
+
+ ApplyBorderToPageStyles( rDM_Impl.GetPageStyles( ), rDM_Impl.GetTextFactory( ), m_nBorderParams );
+
+ try
+ {
+// if( m_xStartingRange.is() )
+ {
+ //now apply this break at the first paragraph of this section
+ uno::Reference< beans::XPropertySet > xRangeProperties;
+ if( m_bIsFirstSection )
+ {
+ uno::Reference< container::XEnumerationAccess > xEnumAccess( rDM_Impl.GetBodyText( ), uno::UNO_QUERY_THROW );
+ uno::Reference< container::XEnumeration > xEnum = xEnumAccess->createEnumeration( );
+ xRangeProperties = uno::Reference< beans::XPropertySet >( xEnum->nextElement( ), uno::UNO_QUERY_THROW );
+ }
+ else
+ xRangeProperties = uno::Reference< beans::XPropertySet >( m_xStartingRange, uno::UNO_QUERY_THROW );
+ /* break type
+ 0 - No break 1 - New Colunn 2 - New page 3 - Even page 4 - odd page */
+ xRangeProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_PAGE_DESC_NAME ),
+ uno::makeAny( m_bTitlePage ? m_sFirstPageStyleName : m_sFollowPageStyleName ));
+ // todo: page breaks with odd/even page numbering are not available - find out current page number to check how to change the number
+ // or add even/odd page break types
+ if(m_bPageNoRestart || m_nPageNumber >= 0)
+ {
+ sal_Int16 nPageNumber = m_nPageNumber >= 0 ? static_cast< sal_Int16 >(m_nPageNumber) : 1;
+ xRangeProperties->setPropertyValue(rPropNameSupplier.GetName( PROP_PAGE_NUMBER_OFFSET ),
+ uno::makeAny( nPageNumber ));
+ }
+ }
+ }
+ catch( const uno::Exception& rEx)
+ {
+ OSL_ENSURE( false, "Exception in SectionPropertyMap::CloseSectionGroup");
+ (void)rEx;
+ }
+ }
+}
+/*-- 11.12.2006 08:31:46---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::_ApplyProperties( uno::Reference< beans::XPropertySet > xStyle )
+{
+ PropertyNameSupplier& rPropNameSupplier = PropertyNameSupplier::GetPropertyNameSupplier();
+ PropertyMap::iterator aMapIter = begin();
+ while( aMapIter != end())
+ {
+ try
+ {
+ xStyle->setPropertyValue( rPropNameSupplier.GetName( aMapIter->first.eId ), aMapIter->second );
+ }
+ catch( const uno::Exception& )
+ {
+ OSL_ENSURE( false, "Exception in <PageStyle>::setPropertyValue");
+ }
+ ++aMapIter;
+ }
+}
+sal_Int32 lcl_AlignPaperBin( sal_Int32 nSet )
+{
+ //default tray numbers are above 0xff
+ if( nSet > 0xff )
+ nSet = nSet >> 8;
+ //there are some special numbers which can't be handled easily
+ //1, 4, 15, manual tray, upper tray, auto select? see ww8atr.cxx
+ //todo: find out appropriate conversion
+ return nSet;
+}
+/*-- 13.12.2006 15:34:01---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::SetPaperBin( sal_Int32 nSet )
+{
+ m_nPaperBin = lcl_AlignPaperBin( nSet );
+}
+/*-- 13.12.2006 15:34:01---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void SectionPropertyMap::SetFirstPaperBin( sal_Int32 nSet )
+{
+ m_nFirstPaperBin = lcl_AlignPaperBin( nSet );
+}
+/*-- 14.06.2007 13:57:42---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+StyleSheetPropertyMap::StyleSheetPropertyMap() :
+// mnCT_Spacing_after( 0 ),
+ mnCT_Spacing_line( 0 ),
+ mnCT_Spacing_lineRule( 0 ),
+ mbCT_TrPrBase_tblHeader( false ),
+ mnCT_TrPrBase_jc( 0 ),
+ mnCT_TcPrBase_vAlign( 0 ),
+ mnCT_TblWidth_w( 0 ),
+ mnCT_TblWidth_type( 0 ),
+// mbCT_Spacing_afterSet( false ),
+ mbCT_Spacing_lineSet( false ),
+ mbCT_Spacing_lineRuleSet( false ),
+ mbCT_TrPrBase_tblHeaderSet( false ),
+ mbCT_TrPrBase_jcSet( false ),
+ mbCT_TcPrBase_vAlignSet( false ),
+ mbCT_TblWidth_wSet( false ),
+ mbCT_TblWidth_typeSet( false ),
+ mnListId( -1 ),
+ mnListLevel( -1 ),
+ mnOutlineLevel( -1 )
+{
+}
+/*-- 14.06.2007 13:57:43---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+StyleSheetPropertyMap::~StyleSheetPropertyMap()
+{
+}
+/*-- 28.12.2007 08:19:00---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+ParagraphProperties::ParagraphProperties() :
+ m_bFrameMode( false ),
+ m_nDropCap(NS_ooxml::LN_Value_wordprocessingml_ST_DropCap_none),
+ m_nLines(0),
+ m_w(-1),
+ m_h(-1),
+ m_nWrap(-1),
+ m_hAnchor(-1),
+ m_vAnchor(text::RelOrientation::FRAME),
+ m_x(-1),
+ m_bxValid( false ),
+ m_y(-1),
+ m_byValid( false ),
+ m_hSpace(-1),
+ m_vSpace(-1),
+ m_hRule(-1),
+ m_xAlign(-1),
+ m_yAlign(-1),
+ m_bAnchorLock(false),
+ m_nDropCapLength(0)
+{
+}
+/*-- 28.12.2007 08:28:24---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+ParagraphProperties::ParagraphProperties(const ParagraphProperties& rCopy) :
+ m_bFrameMode ( rCopy.m_bFrameMode),
+ m_nDropCap ( rCopy.m_nDropCap),
+ m_nLines ( rCopy.m_nLines),
+ m_w ( rCopy.m_w),
+ m_h ( rCopy.m_h),
+ m_nWrap ( rCopy.m_nWrap),
+ m_hAnchor ( rCopy.m_hAnchor),
+ m_vAnchor ( rCopy.m_vAnchor),
+ m_x ( rCopy.m_x),
+ m_bxValid ( rCopy.m_bxValid),
+ m_y ( rCopy.m_y),
+ m_byValid ( rCopy.m_byValid),
+ m_hSpace ( rCopy.m_hSpace),
+ m_vSpace ( rCopy.m_vSpace),
+ m_hRule ( rCopy.m_hRule),
+ m_xAlign ( rCopy.m_xAlign),
+ m_yAlign ( rCopy.m_yAlign),
+ m_bAnchorLock( rCopy.m_bAnchorLock),
+ m_nDropCapLength( rCopy.m_nDropCapLength ),
+ m_sParaStyleName( rCopy.m_sParaStyleName),
+ m_xStartingRange( rCopy.m_xStartingRange ),
+ m_xEndingRange( rCopy.m_xEndingRange)
+{
+}
+/*-- 28.12.2007 11:29:18---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+ParagraphProperties::~ParagraphProperties()
+{
+}
+/*-- 28.12.2007 09:05:45---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+int ParagraphProperties::operator==(const ParagraphProperties& rCompare)
+{
+ return
+ m_bFrameMode == rCompare.m_bFrameMode &&
+ m_nDropCap == rCompare.m_nDropCap &&
+ m_nLines == rCompare.m_nLines &&
+ m_w == rCompare.m_w &&
+ m_h == rCompare.m_h &&
+ m_nWrap == rCompare.m_nWrap &&
+ m_hAnchor == rCompare.m_hAnchor &&
+ m_vAnchor == rCompare.m_vAnchor &&
+ m_x == rCompare.m_x &&
+ m_bxValid == rCompare.m_bxValid &&
+ m_y == rCompare.m_y &&
+ m_byValid == rCompare.m_byValid &&
+ m_hSpace == rCompare.m_hSpace &&
+ m_vSpace == rCompare.m_vSpace &&
+ m_hRule == rCompare.m_hRule &&
+ m_xAlign == rCompare.m_xAlign &&
+ m_yAlign == rCompare.m_yAlign &&
+ m_bAnchorLock== rCompare.m_bAnchorLock;
+}
+/*-- 27.12.2007 13:32:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+ParagraphPropertyMap::ParagraphPropertyMap()
+{
+}
+/*-- 27.12.2007 13:32:36---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+ParagraphPropertyMap::~ParagraphPropertyMap()
+{
+}
+/*-- 15.02.2008 16:10:39---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+TablePropertyMap::TablePropertyMap()
+{
+}
+/*-- 15.02.2008 16:10:39---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+TablePropertyMap::~TablePropertyMap()
+{
+}
+/*-- 18.02.2008 10:06:30---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+bool TablePropertyMap::getValue( TablePropertyMapTarget eWhich, sal_Int32& nFill )
+{
+ if( eWhich < TablePropertyMapTarget_MAX )
+ {
+ if(m_aValidValues[eWhich].bValid)
+ nFill = m_aValidValues[eWhich].nValue;
+ return m_aValidValues[eWhich].bValid;
+ }
+ else
+ {
+ OSL_ENSURE( false, "invalid TablePropertyMapTarget");
+ return false;
+ }
+}
+/*-- 18.02.2008 10:07:11---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void TablePropertyMap::setValue( TablePropertyMapTarget eWhich, sal_Int32 nSet )
+{
+ if( eWhich < TablePropertyMapTarget_MAX )
+ {
+ m_aValidValues[eWhich].bValid = true;
+ m_aValidValues[eWhich].nValue = nSet;
+ }
+ else
+ OSL_ENSURE( false, "invalid TablePropertyMapTarget");
+}
+/*-- 18.02.2008 11:23:28---------------------------------------------------
+
+ -----------------------------------------------------------------------*/
+void TablePropertyMap::insertTableProperties( const PropertyMap* pMap )
+{
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->startElement("TablePropertyMap.insertTableProperties");
+ dmapper_logger->addTag(pMap->toTag());
+#endif
+
+ const TablePropertyMap* pSource = dynamic_cast< const TablePropertyMap* >(pMap);
+ if( pSource )
+ {
+ for( sal_Int32 eTarget = TablePropertyMapTarget_START;
+ eTarget < TablePropertyMapTarget_MAX; ++eTarget )
+ {
+ if( pSource->m_aValidValues[eTarget].bValid )
+ {
+ m_aValidValues[eTarget].bValid = true;
+ m_aValidValues[eTarget].nValue = pSource->m_aValidValues[eTarget].nValue;
+ }
+ }
+ }
+#ifdef DEBUG_DOMAINMAPPER
+ dmapper_logger->addTag(toTag());
+ dmapper_logger->endElement("TablePropertyMap.insertTableProperties");
+#endif
+}
+
+
+}//namespace dmapper
+}//namespace writerfilter