blob: 438a60a28c8858f512284e453f71f42afbd5c5e9 [file] [log] [blame]
/**************************************************************
*
* 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.
*
*************************************************************/
#ifndef INCLUDED_DMAPPER_PROPERTYMAP_HXX
#define INCLUDED_DMAPPER_PROPERTYMAP_HXX
#include <rtl/ustring.hxx>
#include <com/sun/star/uno/Sequence.hxx>
#ifndef _COM_SUN_STAR_BEANS_PROPERTYVALUE_HXX_
#include <com/sun/star/beans/PropertyValue.hpp>
#endif
#include <com/sun/star/beans/XPropertySet.hpp>
#include <com/sun/star/uno/Any.h>
#include <PropertyIds.hxx>
#include <boost/shared_ptr.hpp>
#include <map>
#include <vector>
#include <resourcemodel/TagLogger.hxx>
namespace com{namespace sun{namespace star{
namespace beans{
struct PropertyValue;
}
namespace container{
class XNameAccess;
class XNameContainer;
}
namespace lang{
class XMultiServiceFactory;
}
namespace text{
class XTextRange;
class XTextColumns;
class XFootnote;
}
namespace table{
struct BorderLine;
}
}}}
namespace writerfilter {
namespace dmapper{
class DomainMapper_Impl;
enum BorderPosition
{
BORDER_LEFT,
BORDER_RIGHT,
BORDER_TOP,
BORDER_BOTTOM
};
/*-- 15.06.2006 08:22:33---------------------------------------------------
-----------------------------------------------------------------------*/
struct PropertyDefinition
{
PropertyIds eId;
bool bIsTextProperty;
PropertyDefinition( PropertyIds _eId, bool _bIsTextProperty ) :
eId( _eId ),
bIsTextProperty( _bIsTextProperty ){}
bool operator== (const PropertyDefinition& rDef) const
{ return rDef.eId == eId; }
bool operator< (const PropertyDefinition& rDef) const
{ return eId < rDef.eId; }
};
typedef std::map < PropertyDefinition, ::com::sun::star::uno::Any > _PropertyMap;
class PropertyMap : public _PropertyMap
{
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > m_aValues;
//marks context as footnote context - ::text( ) events contain either the footnote character or can be ignored
//depending on sprmCSymbol
sal_Unicode m_cFootnoteSymbol; // 0 == invalid
sal_Int32 m_nFootnoteFontId; // negative values are invalid ids
::rtl::OUString m_sFootnoteFontName;
::com::sun::star::uno::Reference< ::com::sun::star::text::XFootnote > m_xFootnote;
protected:
void Invalidate()
{
if(m_aValues.getLength())
m_aValues.realloc( 0 );
}
public:
PropertyMap();
virtual ~PropertyMap();
::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue > GetPropertyValues();
bool hasEmptyPropertyValues() const {return !m_aValues.getLength();}
/** Add property, usually overwrites already available attributes. It shouldn't overwrite in case of default attributes
*/
void Insert( PropertyIds eId, bool bIsTextProperty, const ::com::sun::star::uno::Any& rAny, bool bOverwrite = true );
using _PropertyMap::insert;
void insert(const boost::shared_ptr<PropertyMap> pMap, bool bOverwrite = true);
const ::com::sun::star::uno::Reference< ::com::sun::star::text::XFootnote>& GetFootnote() const;
void SetFootnote( ::com::sun::star::uno::Reference< ::com::sun::star::text::XFootnote> xF ) { m_xFootnote = xF; }
sal_Unicode GetFootnoteSymbol() const { return m_cFootnoteSymbol;}
void SetFootnoteSymbol(sal_Unicode cSet) { m_cFootnoteSymbol = cSet;}
sal_Int32 GetFootnoteFontId() const { return m_nFootnoteFontId;}
void SetFootnoteFontId(sal_Int32 nSet) { m_nFootnoteFontId = nSet;}
const ::rtl::OUString& GetFootnoteFontName() const { return m_sFootnoteFontName;}
void SetFootnoteFontName( const ::rtl::OUString& rSet ) { m_sFootnoteFontName = rSet;}
virtual void insertTableProperties( const PropertyMap* );
virtual XMLTag::Pointer_t toTag() const;
};
typedef boost::shared_ptr<PropertyMap> PropertyMapPtr;
/*-- 24.07.2006 08:26:33---------------------------------------------------
-----------------------------------------------------------------------*/
class SectionPropertyMap : public PropertyMap
{
//--> debug
sal_Int32 nSectionNumber;
//<-- debug
//'temporarily' the section page settings are imported as page styles
// empty strings mark page settings as not yet imported
bool m_bIsFirstSection;
::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > m_xStartingRange;
::rtl::OUString m_sFirstPageStyleName;
::rtl::OUString m_sFollowPageStyleName;
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_aFirstPageStyle;
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > m_aFollowPageStyle;
::com::sun::star::table::BorderLine* m_pBorderLines[4];
sal_Int32 m_nBorderDistances[4];
sal_Int32 m_nBorderParams;
bool m_bTitlePage;
sal_Int16 m_nColumnCount;
sal_Int32 m_nColumnDistance;
::std::vector< sal_Int32 > m_aColWidth;
::std::vector< sal_Int32 > m_aColDistance;
bool m_bSeparatorLineIsOn;
bool m_bEvenlySpaced;
bool m_bIsLandscape;
bool m_bPageNoRestart;
sal_Int32 m_nPageNumber;
sal_Int32 m_nBreakType;
sal_Int32 m_nPaperBin;
sal_Int32 m_nFirstPaperBin;
sal_Int32 m_nLeftMargin;
sal_Int32 m_nRightMargin;
sal_Int32 m_nTopMargin;
sal_Int32 m_nBottomMargin;
sal_Int32 m_nHeaderTop;
sal_Int32 m_nHeaderBottom;
sal_Int32 m_nDzaGutter;
bool m_bGutterRTL;
bool m_bSFBiDi;
sal_Int32 m_nGridType;
sal_Int32 m_nGridLinePitch;
sal_Int32 m_nDxtCharSpace;
//line numbering
sal_Int32 m_nLnnMod;
sal_Int32 m_nLnc;
sal_Int32 m_ndxaLnn;
sal_Int32 m_nLnnMin;
void _ApplyProperties( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xStyle );
::com::sun::star::uno::Reference< com::sun::star::text::XTextColumns > ApplyColumnProperties(
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xFollowPageStyle );
void CopyLastHeaderFooter( bool bFirstPage, DomainMapper_Impl& rDM_Impl );
void PrepareHeaderFooterProperties( bool bFirstPage );
bool HasHeader( bool bFirstPage ) const;
bool HasFooter( bool bFirstPage ) const;
void SetBorderDistance( ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > xStyle,
PropertyIds eMarginId, PropertyIds eDistId, sal_Int32 nDistance, sal_Int32 nOffsetFrom );
public:
explicit SectionPropertyMap(bool bIsFirstSection);
~SectionPropertyMap();
enum PageType
{
PAGE_FIRST,
PAGE_LEFT,
PAGE_RIGHT
};
void SetStart( const ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange >& xRange )
{
m_xStartingRange = xRange;
}
const ::rtl::OUString& GetPageStyleName( bool bFirst );
void SetPageStyleName( bool bFirst, const ::rtl::OUString& rName);
::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > GetPageStyle(
const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& xStyles,
const ::com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory >& xTextFactory,
bool bFirst );
void SetBorder( BorderPosition ePos, sal_Int32 nLineDistance, const ::com::sun::star::table::BorderLine& rBorderLine );
void SetBorderParams( sal_Int32 nSet ) { m_nBorderParams = nSet; }
void SetColumnCount( sal_Int16 nCount ) { m_nColumnCount = nCount; }
void SetColumnDistance( sal_Int32 nDist ) { m_nColumnDistance = nDist; }
void AppendColumnWidth( sal_Int32 nWidth ) { m_aColWidth.push_back( nWidth ); }
void AppendColumnSpacing( sal_Int32 nDist ) {m_aColDistance.push_back( nDist ); }
void SetTitlePage( bool bSet ) { m_bTitlePage = bSet; }
void SetSeparatorLine( bool bSet ) { m_bSeparatorLineIsOn = bSet; }
void SetEvenlySpaced( bool bSet ) { m_bEvenlySpaced = bSet; }
void SetLandscape( bool bSet ) { m_bIsLandscape = bSet; }
void SetPageNoRestart( bool bSet ) { m_bPageNoRestart = bSet; }
void SetPageNumber( sal_Int32 nSet ) { m_nPageNumber = nSet; }
void SetBreakType( sal_Int32 nSet ) { m_nBreakType = nSet; }
void SetPaperBin( sal_Int32 nSet );
void SetFirstPaperBin( sal_Int32 nSet );
void SetLeftMargin( sal_Int32 nSet ) { m_nLeftMargin = nSet; }
void SetRightMargin( sal_Int32 nSet ) { m_nRightMargin = nSet; }
void SetTopMargin( sal_Int32 nSet ) { m_nTopMargin = nSet; }
void SetBottomMargin( sal_Int32 nSet ) { m_nBottomMargin = nSet; }
void SetHeaderTop( sal_Int32 nSet ) { m_nHeaderTop = nSet; }
void SetHeaderBottom( sal_Int32 nSet ) { m_nHeaderBottom = nSet; }
void SetGutterRTL( bool bSet ) { m_bGutterRTL = bSet;}
void SetDzaGutter( sal_Int32 nSet ) {m_nDzaGutter = nSet; }
void SetSFBiDi( bool bSet ) { m_bSFBiDi = bSet;}
void SetGridType(sal_Int32 nSet) { m_nGridType = nSet; }
void SetGridLinePitch( sal_Int32 nSet ) { m_nGridLinePitch = nSet; }
void SetDxtCharSpace( sal_Int32 nSet ) { m_nDxtCharSpace = nSet; }
void SetLnnMod( sal_Int32 nValue ) { m_nLnnMod = nValue; }
void SetLnc( sal_Int32 nValue ) { m_nLnc = nValue; }
void SetdxaLnn( sal_Int32 nValue ) { m_ndxaLnn = nValue; }
void SetLnnMin( sal_Int32 nValue ) { m_nLnnMin = nValue; }
//determine which style gets the borders
void ApplyBorderToPageStyles(
const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameContainer >& xStyles,
const ::com::sun::star::uno::Reference < ::com::sun::star::lang::XMultiServiceFactory >& xTextFactory,
sal_Int32 nValue );
void CloseSectionGroup( DomainMapper_Impl& rDM_Impl );
};
typedef boost::shared_ptr<SectionPropertyMap> SectionPropertyMapPtr;
/*-- 28.12.2007 08:17:34---------------------------------------------------
-----------------------------------------------------------------------*/
class ParagraphProperties
{
bool m_bFrameMode;
sal_Int32 m_nDropCap; //drop, margin ST_DropCap
sal_Int32 m_nLines; //number of lines of the drop cap
sal_Int32 m_w; //width
sal_Int32 m_h; //height
sal_Int32 m_nWrap; // from ST_Wrap around, auto, none, notBeside, through, tight
sal_Int32 m_hAnchor; // page, from ST_HAnchor margin, page, text
sal_Int32 m_vAnchor; // around from ST_VAnchor margin, page, text
sal_Int32 m_x; //x-position
bool m_bxValid;
sal_Int32 m_y; //y-position
bool m_byValid;
sal_Int32 m_hSpace; //frame padding h
sal_Int32 m_vSpace; //frame padding v
sal_Int32 m_hRule; // from ST_HeightRule exact, atLeast, auto
sal_Int32 m_xAlign; // from ST_XAlign center, inside, left, outside, right
sal_Int32 m_yAlign; // from ST_YAlign bottom, center, inline, inside, outside, top
bool m_bAnchorLock;
sal_Int8 m_nDropCapLength; //number of characters
::rtl::OUString m_sParaStyleName;
::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > m_xStartingRange; //start of a frame
::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > m_xEndingRange; //end of the frame
public:
ParagraphProperties();
ParagraphProperties(const ParagraphProperties&);
~ParagraphProperties();
int operator==(const ParagraphProperties&); //does not compare the starting/ending range, m_sParaStyleName and m_nDropCapLength
void SetFrameMode() { m_bFrameMode = true; }
bool IsFrameMode()const { return m_bFrameMode; }
void SetDropCap( sal_Int32 nSet ) { m_nDropCap = nSet; }
sal_Int32 GetDropCap()const { return m_nDropCap; }
void SetLines( sal_Int32 nSet ) { m_nLines = nSet; }
sal_Int32 GetLines() const { return m_nLines; }
void Setw( sal_Int32 nSet ) { m_w = nSet; }
sal_Int32 Getw() const { return m_w; }
void Seth( sal_Int32 nSet ) { m_h = nSet; }
sal_Int32 Geth() const { return m_h; }
void SetWrap( sal_Int32 nSet ) { m_nWrap = nSet; }
sal_Int32 GetWrap() const { return m_nWrap; }
void SethAnchor( sal_Int32 nSet ) { m_hAnchor = nSet; }
sal_Int32 GethAnchor() const { return m_hAnchor;}
void SetvAnchor( sal_Int32 nSet ) { m_vAnchor = nSet; }
sal_Int32 GetvAnchor() const { return m_vAnchor; }
void Setx( sal_Int32 nSet ) { m_x = nSet; m_bxValid = true;}
sal_Int32 Getx() const { return m_x; }
bool IsxValid() const {return m_bxValid;}
void Sety( sal_Int32 nSet ) { m_y = nSet; m_byValid = true;}
sal_Int32 Gety()const { return m_y; }
bool IsyValid() const {return m_byValid;}
void SethSpace( sal_Int32 nSet ) { m_hSpace = nSet; }
sal_Int32 GethSpace()const { return m_hSpace; }
void SetvSpace( sal_Int32 nSet ) { m_vSpace = nSet; }
sal_Int32 GetvSpace()const { return m_vSpace; }
void SethRule( sal_Int32 nSet ) { m_hRule = nSet; }
sal_Int32 GethRule() const { return m_hRule; }
void SetxAlign( sal_Int32 nSet ) { m_xAlign = nSet; }
sal_Int32 GetxAlign()const { return m_xAlign; }
void SetyAlign( sal_Int32 nSet ) { m_yAlign = nSet; }
sal_Int32 GetyAlign()const { return m_yAlign; }
void SetAnchorLock( bool bSet ) {m_bAnchorLock = bSet; }
sal_Int8 GetDropCapLength() const { return m_nDropCapLength;}
void SetDropCapLength(sal_Int8 nSet) { m_nDropCapLength = nSet;}
::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > GetStartingRange() const { return m_xStartingRange; }
void SetStartingRange( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xSet ) { m_xStartingRange = xSet; }
::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > GetEndingRange() const { return m_xEndingRange; }
void SetEndingRange( ::com::sun::star::uno::Reference< ::com::sun::star::text::XTextRange > xSet ) { m_xEndingRange = xSet; }
void SetParaStyleName( const ::rtl::OUString& rSet ) { m_sParaStyleName = rSet;}
const ::rtl::OUString& GetParaStyleName() const { return m_sParaStyleName;}
};
typedef boost::shared_ptr<ParagraphProperties> ParagraphPropertiesPtr;
/*-- 14.06.2007 12:12:34---------------------------------------------------
property map of a stylesheet
-----------------------------------------------------------------------*/
#define WW_OUTLINE_MAX sal_Int16( 9 )
#define WW_OUTLINE_MIN sal_Int16( 0 )
class StyleSheetPropertyMap : public PropertyMap, public ParagraphProperties
{
//special table style properties
// sal_Int32 mnCT_Spacing_after;
sal_Int32 mnCT_Spacing_line;
sal_Int32 mnCT_Spacing_lineRule;
::rtl::OUString msCT_Fonts_ascii;
bool mbCT_TrPrBase_tblHeader;
sal_Int32 mnCT_TrPrBase_jc;
sal_Int32 mnCT_TcPrBase_vAlign;
sal_Int32 mnCT_TblWidth_w;
sal_Int32 mnCT_TblWidth_type;
// bool mbCT_Spacing_afterSet;
bool mbCT_Spacing_lineSet;
bool mbCT_Spacing_lineRuleSet;
bool mbCT_TrPrBase_tblHeaderSet;
bool mbCT_TrPrBase_jcSet;
bool mbCT_TcPrBase_vAlignSet;
bool mbCT_TblWidth_wSet;
bool mbCT_TblWidth_typeSet;
sal_Int32 mnListId;
sal_Int16 mnListLevel;
sal_Int16 mnOutlineLevel;
sal_Int32 mnNumId;
public:
explicit StyleSheetPropertyMap();
~StyleSheetPropertyMap();
// void SetCT_Spacing_after( sal_Int32 nSet )
// {mnCT_Spacing_after = nSet; mbCT_Spacing_afterSet = true; }
void SetCT_Spacing_line( sal_Int32 nSet )
{mnCT_Spacing_line = nSet; mbCT_Spacing_lineSet = true; }
void SetCT_Spacing_lineRule( sal_Int32 nSet )
{mnCT_Spacing_lineRule = nSet; mbCT_Spacing_lineRuleSet = true; }
void SetCT_Fonts_ascii( const ::rtl::OUString& rSet )
{msCT_Fonts_ascii = rSet; }
void SetCT_TrPrBase_tblHeader( bool bSet )
{mbCT_TrPrBase_tblHeader = bSet; mbCT_TrPrBase_tblHeaderSet = true; }
void SetCT_TrPrBase_jc( sal_Int32 nSet )
{mnCT_TrPrBase_jc = nSet; mbCT_TrPrBase_jcSet = true; }
void SetCT_TcPrBase_vAlign( sal_Int32 nSet )
{mnCT_TcPrBase_vAlign = nSet; mbCT_TcPrBase_vAlignSet = true; }
void SetCT_TblWidth_w( sal_Int32 nSet )
{ mnCT_TblWidth_w = nSet; mbCT_TblWidth_wSet = true; }
void SetCT_TblWidth_type( sal_Int32 nSet )
{mnCT_TblWidth_type = nSet; mbCT_TblWidth_typeSet = true; }
// bool GetCT_Spacing_after( sal_Int32& rToFill) const
// {
// if( mbCT_Spacing_afterSet )
// rToFill = mnCT_Spacing_after;
// return mbCT_Spacing_afterSet;
// }
bool GetCT_Spacing_line( sal_Int32& rToFill) const
{
if( mbCT_Spacing_lineSet )
rToFill = mnCT_Spacing_line;
return mbCT_Spacing_lineSet;
}
bool GetCT_Spacing_lineRule(sal_Int32& rToFill) const
{
if( mbCT_Spacing_lineRuleSet )
rToFill = mnCT_Spacing_lineRule;
return mbCT_Spacing_lineRuleSet;
}
bool GetCT_Fonts_ascii(::rtl::OUString& rToFill) const
{
if( msCT_Fonts_ascii.getLength() > 0 )
rToFill = msCT_Fonts_ascii;
return msCT_Fonts_ascii.getLength() > 0;
}
bool GetCT_TrPrBase_tblHeader(bool& rToFill) const
{
if( mbCT_TrPrBase_tblHeaderSet )
rToFill = mbCT_TrPrBase_tblHeader;
return mbCT_TrPrBase_tblHeaderSet;
}
bool GetCT_TrPrBase_jc( sal_Int32& rToFill)const
{
if( mbCT_TrPrBase_jcSet )
rToFill = mnCT_TrPrBase_jc;
return mbCT_TrPrBase_jcSet;
}
bool GetCT_TcPrBase_vAlign( sal_Int32& rToFill)const
{
if( mbCT_TcPrBase_vAlignSet )
rToFill = mnCT_TcPrBase_vAlign;
return mbCT_TcPrBase_vAlignSet;
}
sal_Int32 GetListId() const { return mnListId; }
void SetListId(sal_Int32 nId) { mnListId = nId; }
sal_Int16 GetListLevel() const { return mnListLevel; }
void SetListLevel(sal_Int16 nLevel) { mnListLevel = nLevel; }
sal_Int16 GetOutlineLevel() const { return mnOutlineLevel; }
void SetOutlineLevel(sal_Int16 nLevel)
{
if ( nLevel <= WW_OUTLINE_MAX )
mnOutlineLevel = nLevel;
}
sal_Int32 GetNumId() const { return mnNumId; }
void SetNumId(sal_Int32 nId) { mnNumId = nId; }
};
/*-- 27.12.2007 12:38:06---------------------------------------------------
-----------------------------------------------------------------------*/
class ParagraphPropertyMap : public PropertyMap, public ParagraphProperties
{
public:
explicit ParagraphPropertyMap();
~ParagraphPropertyMap();
};
/*-- 15.02.2008 16:06:52---------------------------------------------------
-----------------------------------------------------------------------*/
class TablePropertyMap : public PropertyMap
{
public:
enum TablePropertyMapTarget
{
TablePropertyMapTarget_START,
CELL_MAR_LEFT = TablePropertyMapTarget_START,
CELL_MAR_RIGHT,
CELL_MAR_TOP,
CELL_MAR_BOTTOM,
TABLE_WIDTH,
GAP_HALF,
LEFT_MARGIN,
HORI_ORIENT,
TablePropertyMapTarget_MAX
};
private:
struct ValidValue
{
sal_Int32 nValue;
bool bValid;
ValidValue() :
nValue( 0 ),
bValid( false ){}
};
ValidValue m_aValidValues[TablePropertyMapTarget_MAX];
public:
explicit TablePropertyMap();
~TablePropertyMap();
bool getValue( TablePropertyMapTarget eWhich, sal_Int32& nFill );
void setValue( TablePropertyMapTarget eWhich, sal_Int32 nSet );
virtual void insertTableProperties( const PropertyMap* );
};
typedef boost::shared_ptr<TablePropertyMap> TablePropertyMapPtr;
} //namespace dmapper
} //namespace writerfilter
#endif