summaryrefslogtreecommitdiff
path: root/sw/source/core/unocore/unostyle.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/unocore/unostyle.cxx')
-rw-r--r--sw/source/core/unocore/unostyle.cxx4241
1 files changed, 4241 insertions, 0 deletions
diff --git a/sw/source/core/unocore/unostyle.cxx b/sw/source/core/unocore/unostyle.cxx
new file mode 100644
index 000000000000..b9a792ab177f
--- /dev/null
+++ b/sw/source/core/unocore/unostyle.cxx
@@ -0,0 +1,4241 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*************************************************************************
+ *
+ * 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.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_sw.hxx"
+
+#include <svx/svxids.hrc>
+#include <hintids.hxx>
+#include <osl/mutex.hxx>
+#include <vcl/svapp.hxx>
+#include <svl/smplhint.hxx>
+#include <svtools/ctrltool.hxx>
+#include <svl/style.hxx>
+#include <svl/itemiter.hxx>
+#include <svx/pageitem.hxx>
+#include <editeng/sizeitem.hxx>
+#include <editeng/ulspitem.hxx>
+#include <editeng/lrspitem.hxx>
+#include <editeng/boxitem.hxx>
+#include <editeng/shaditem.hxx>
+#include <editeng/brshitem.hxx>
+#include <editeng/flstitem.hxx>
+#include <editeng/paperinf.hxx>
+#include <pagedesc.hxx>
+#include <doc.hxx>
+#include <docary.hxx>
+#include <charfmt.hxx>
+#include <cmdid.h>
+#include <unostyle.hxx>
+#include <unosett.hxx>
+#include <docsh.hxx>
+#include <swstyle.h>
+#include <paratr.hxx>
+#include <unoprnms.hxx>
+#include <shellio.hxx>
+#include <docstyle.hxx>
+#include <unotextbodyhf.hxx>
+#include <fmthdft.hxx>
+#include <fmtpdsc.hxx>
+#include <tools/urlobj.hxx>
+#include <poolfmt.hrc>
+#include <poolfmt.hxx>
+#include "unoevent.hxx"
+#include <fmtruby.hxx>
+#include <SwStyleNameMapper.hxx>
+#include <sfx2/printer.hxx>
+#include <com/sun/star/style/ParagraphStyleCategory.hpp>
+#include <com/sun/star/style/XStyleFamiliesSupplier.hpp>
+#include <com/sun/star/beans/PropertyAttribute.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <istyleaccess.hxx>
+#include <GetMetricVal.hxx>
+#include <fmtfsize.hxx>
+#include <numrule.hxx>
+
+#include <boost/shared_ptr.hpp>
+
+#include "ccoll.hxx"
+#include "unocore.hrc"
+
+#include <set>
+
+#define STYLE_FAMILY_COUNT 5 // we have 5 style families
+#define TYPE_BOOL 0
+#define TYPE_SIZE 1
+#define TYPE_BRUSH 2
+#define TYPE_ULSPACE 3
+#define TYPE_SHADOW 4
+#define TYPE_LRSPACE 5
+#define TYPE_BOX 6
+
+const unsigned short aStyleByIndex[] =
+{
+ SFX_STYLE_FAMILY_CHAR,
+ SFX_STYLE_FAMILY_PARA,
+ SFX_STYLE_FAMILY_PAGE ,
+ SFX_STYLE_FAMILY_FRAME ,
+ SFX_STYLE_FAMILY_PSEUDO
+};
+
+// Already implemented autostyle families: 3
+#define AUTOSTYLE_FAMILY_COUNT 3
+const IStyleAccess::SwAutoStyleFamily aAutoStyleByIndex[] =
+{
+ IStyleAccess::AUTO_STYLE_CHAR,
+ IStyleAccess::AUTO_STYLE_RUBY,
+ IStyleAccess::AUTO_STYLE_PARA
+};
+
+using namespace ::com::sun::star;
+using ::rtl::OUString;
+
+//convert FN_... to RES_ in header and footer itemset
+sal_uInt16 lcl_ConvertFNToRES(sal_uInt16 nFNId)
+{
+ sal_uInt16 nRes = USHRT_MAX;
+ switch(nFNId)
+ {
+ case FN_UNO_FOOTER_ON:
+ case FN_UNO_HEADER_ON:
+ break;
+ case FN_UNO_FOOTER_BACKGROUND:
+ case FN_UNO_HEADER_BACKGROUND: nRes = RES_BACKGROUND;
+ break;
+ case FN_UNO_FOOTER_BOX:
+ case FN_UNO_HEADER_BOX: nRes = RES_BOX;
+ break;
+ case FN_UNO_FOOTER_LR_SPACE:
+ case FN_UNO_HEADER_LR_SPACE: nRes = RES_LR_SPACE;
+ break;
+ case FN_UNO_FOOTER_SHADOW:
+ case FN_UNO_HEADER_SHADOW: nRes = RES_SHADOW;
+ break;
+ case FN_UNO_FOOTER_BODY_DISTANCE:
+ case FN_UNO_HEADER_BODY_DISTANCE: nRes = RES_UL_SPACE;
+ break;
+ case FN_UNO_FOOTER_IS_DYNAMIC_DISTANCE:
+ case FN_UNO_HEADER_IS_DYNAMIC_DISTANCE: nRes = SID_ATTR_PAGE_DYNAMIC;
+ break;
+ case FN_UNO_FOOTER_SHARE_CONTENT:
+ case FN_UNO_HEADER_SHARE_CONTENT: nRes = SID_ATTR_PAGE_SHARED;
+ break;
+ case FN_UNO_FOOTER_HEIGHT:
+ case FN_UNO_HEADER_HEIGHT: nRes = SID_ATTR_PAGE_SIZE;
+ break;
+ case FN_UNO_FOOTER_EAT_SPACING:
+ case FN_UNO_HEADER_EAT_SPACING: nRes = RES_HEADER_FOOTER_EAT_SPACING;
+ break;
+ }
+ return nRes;
+
+}
+
+SwGetPoolIdFromName lcl_GetSwEnumFromSfxEnum ( SfxStyleFamily eFamily )
+{
+ switch ( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ return nsSwGetPoolIdFromName::GET_POOLID_CHRFMT;
+ case SFX_STYLE_FAMILY_PARA:
+ return nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL;
+ case SFX_STYLE_FAMILY_FRAME:
+ return nsSwGetPoolIdFromName::GET_POOLID_FRMFMT;
+ case SFX_STYLE_FAMILY_PAGE:
+ return nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ return nsSwGetPoolIdFromName::GET_POOLID_NUMRULE;
+ default:
+ DBG_ASSERT(sal_False, "someone asking for all styles in unostyle.cxx!" );
+ return nsSwGetPoolIdFromName::GET_POOLID_CHRFMT;
+ }
+}
+
+class SwAutoStylesEnumImpl
+{
+ std::vector<SfxItemSet_Pointer_t> mAutoStyles;
+ std::vector<SfxItemSet_Pointer_t>::iterator aIter;
+ SwDoc* pDoc;
+ IStyleAccess::SwAutoStyleFamily eFamily;
+public:
+ SwAutoStylesEnumImpl( SwDoc* pInitDoc, IStyleAccess::SwAutoStyleFamily eFam );
+ ::sal_Bool hasMoreElements() { return aIter != mAutoStyles.end(); }
+ SfxItemSet_Pointer_t nextElement() { return *(aIter++); }
+ IStyleAccess::SwAutoStyleFamily getFamily() const { return eFamily; }
+ SwDoc* getDoc() const { return pDoc; }
+};
+
+/******************************************************************
+ * SwXStyleFamilies
+ ******************************************************************/
+OUString SwXStyleFamilies::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXStyleFamilies");
+}
+
+sal_Bool SwXStyleFamilies::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return C2U("com.sun.star.style.StyleFamilies") == rServiceName;
+}
+
+uno::Sequence< OUString > SwXStyleFamilies::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.style.StyleFamilies");
+ return aRet;
+}
+
+SwXStyleFamilies::SwXStyleFamilies(SwDocShell& rDocShell) :
+ SwUnoCollection(rDocShell.GetDoc()),
+ pDocShell(&rDocShell),
+ pxCharStyles(0),
+ pxParaStyles(0),
+ pxFrameStyles(0),
+ pxPageStyles(0),
+ pxNumberingStyles(0)
+{
+
+}
+
+SwXStyleFamilies::~SwXStyleFamilies()
+{
+ delete pxCharStyles;
+ delete pxParaStyles;
+ delete pxFrameStyles;
+ delete pxPageStyles;
+ delete pxNumberingStyles;
+}
+
+uno::Any SAL_CALL SwXStyleFamilies::getByName(const OUString& Name)
+ throw(
+ container::NoSuchElementException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+// der Index kommt aus const unsigned short aStyleByIndex[] =
+ uno::Any aRet;
+ if(!IsValid())
+ throw uno::RuntimeException();
+ if(Name.compareToAscii("CharacterStyles") == 0 )
+ aRet = getByIndex(0);
+ else if(Name.compareToAscii("ParagraphStyles") == 0)
+ aRet = getByIndex(1);
+ else if(Name.compareToAscii("FrameStyles") == 0 )
+ aRet = getByIndex(3);
+ else if(Name.compareToAscii("PageStyles") == 0 )
+ aRet = getByIndex(2);
+ else if(Name.compareToAscii("NumberingStyles") == 0 )
+ aRet = getByIndex(4);
+ else
+ throw container::NoSuchElementException();
+ return aRet;
+}
+
+uno::Sequence< OUString > SwXStyleFamilies::getElementNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aNames(STYLE_FAMILY_COUNT);
+ OUString* pNames = aNames.getArray();
+ pNames[0] = C2U("CharacterStyles");
+ pNames[1] = C2U("ParagraphStyles");
+ pNames[2] = C2U("FrameStyles");
+ pNames[3] = C2U("PageStyles");
+ pNames[4] = C2U("NumberingStyles");
+ return aNames;
+}
+
+sal_Bool SwXStyleFamilies::hasByName(const OUString& Name) throw( uno::RuntimeException )
+{
+ if( Name.compareToAscii("CharacterStyles") == 0 ||
+ Name.compareToAscii("ParagraphStyles") == 0 ||
+ Name.compareToAscii("FrameStyles") == 0 ||
+ Name.compareToAscii("PageStyles") == 0 ||
+ Name.compareToAscii("NumberingStyles") == 0 )
+ return sal_True;
+ else
+ return sal_False;
+}
+
+sal_Int32 SwXStyleFamilies::getCount(void) throw( uno::RuntimeException )
+{
+ return STYLE_FAMILY_COUNT;
+}
+
+uno::Any SwXStyleFamilies::getByIndex(sal_Int32 nIndex)
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Any aRet;
+ if(nIndex < 0 || nIndex >= STYLE_FAMILY_COUNT)
+ throw lang::IndexOutOfBoundsException();
+ if(IsValid())
+ {
+ uno::Reference< container::XNameContainer > aRef;
+ sal_uInt16 nType = aStyleByIndex[nIndex];
+ switch( nType )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ {
+ if(!pxCharStyles)
+ {
+ ((SwXStyleFamilies*)this)->pxCharStyles = new uno::Reference< container::XNameContainer > ();
+ *pxCharStyles = new SwXStyleFamily(pDocShell, nType);
+ }
+ aRef = *pxCharStyles;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ {
+ if(!pxParaStyles)
+ {
+ ((SwXStyleFamilies*)this)->pxParaStyles = new uno::Reference< container::XNameContainer > ();
+ *pxParaStyles = new SwXStyleFamily(pDocShell, nType);
+ }
+ aRef = *pxParaStyles;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PAGE :
+ {
+ if(!pxPageStyles)
+ {
+ ((SwXStyleFamilies*)this)->pxPageStyles = new uno::Reference< container::XNameContainer > ();
+ *pxPageStyles = new SwXStyleFamily(pDocShell, nType);
+ }
+ aRef = *pxPageStyles;
+ }
+ break;
+ case SFX_STYLE_FAMILY_FRAME :
+ {
+ if(!pxFrameStyles)
+ {
+ ((SwXStyleFamilies*)this)->pxFrameStyles = new uno::Reference< container::XNameContainer > ();
+ *pxFrameStyles = new SwXStyleFamily(pDocShell, nType);
+ }
+ aRef = *pxFrameStyles;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ {
+ if(!pxNumberingStyles)
+ {
+ ((SwXStyleFamilies*)this)->pxNumberingStyles = new uno::Reference< container::XNameContainer > ();
+ *pxNumberingStyles = new SwXStyleFamily(pDocShell, nType);
+ }
+ aRef = *pxNumberingStyles;
+ }
+ break;
+ }
+ aRet.setValue(&aRef, ::getCppuType((const uno::Reference<container::XNameContainer>*)0));
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+
+uno::Type SwXStyleFamilies::getElementType(void)
+ throw( uno::RuntimeException )
+{
+ return ::getCppuType((const uno::Reference<container::XNameContainer>*)0);
+
+}
+
+sal_Bool SwXStyleFamilies::hasElements(void) throw( uno::RuntimeException )
+{
+ return sal_True;
+}
+
+void SwXStyleFamilies::loadStylesFromURL(const OUString& rURL,
+ const uno::Sequence< beans::PropertyValue >& aOptions)
+ throw( io::IOException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ sal_Bool bLoadStyleText = sal_True;
+ sal_Bool bLoadStylePage = sal_True;
+ sal_Bool bLoadStyleOverwrite = sal_True;
+ sal_Bool bLoadStyleNumbering = sal_True;
+ sal_Bool bLoadStyleFrame = sal_True;
+ if(IsValid() && rURL.getLength())
+ {
+ const uno::Any* pVal;
+ int nCount = aOptions.getLength();
+ const beans::PropertyValue* pArray = aOptions.getConstArray();
+ for(int i = 0; i < nCount; i++)
+ if( ( pVal = &pArray[i].Value)->getValueType() ==
+ ::getBooleanCppuType() )
+ {
+ String sName = pArray[i].Name;
+ sal_Bool bVal = *(sal_Bool*)pVal->getValue();
+ if( sName.EqualsAscii(SW_PROP_NAME_STR(UNO_NAME_OVERWRITE_STYLES )))
+ bLoadStyleOverwrite = bVal;
+ else if( sName.EqualsAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_NUMBERING_STYLES )))
+ bLoadStyleNumbering = bVal;
+ else if( sName.EqualsAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_PAGE_STYLES )))
+ bLoadStylePage = bVal;
+ else if( sName.EqualsAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_FRAME_STYLES )))
+ bLoadStyleFrame = bVal;
+ else if( sName.EqualsAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_TEXT_STYLES )))
+ bLoadStyleText = bVal;
+ }
+
+ SwgReaderOption aOpt;
+ aOpt.SetFrmFmts( bLoadStyleFrame );
+ aOpt.SetTxtFmts( bLoadStyleText );
+ aOpt.SetPageDescs( bLoadStylePage );
+ aOpt.SetNumRules( bLoadStyleNumbering );
+ aOpt.SetMerge( !bLoadStyleOverwrite );
+
+ ULONG nErr = pDocShell->LoadStylesFromFile( rURL, aOpt, TRUE );
+ if( nErr )
+ throw io::IOException();
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+uno::Sequence< beans::PropertyValue > SwXStyleFamilies::getStyleLoaderOptions(void)
+ throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Sequence< beans::PropertyValue > aSeq(5);
+ beans::PropertyValue* pArray = aSeq.getArray();
+ uno::Any aVal;
+ sal_Bool bTemp = sal_True;
+ aVal.setValue(&bTemp, ::getCppuBooleanType());
+ pArray[0] = beans::PropertyValue(rtl::OUString::createFromAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_TEXT_STYLES)), -1, aVal, beans::PropertyState_DIRECT_VALUE);
+ aVal.setValue(&bTemp, ::getCppuBooleanType());
+ pArray[1] = beans::PropertyValue(rtl::OUString::createFromAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_FRAME_STYLES)), -1, aVal, beans::PropertyState_DIRECT_VALUE);
+ aVal.setValue(&bTemp, ::getCppuBooleanType());
+ pArray[2] = beans::PropertyValue(rtl::OUString::createFromAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_PAGE_STYLES)), -1, aVal, beans::PropertyState_DIRECT_VALUE);
+ aVal.setValue(&bTemp, ::getCppuBooleanType());
+ pArray[3] = beans::PropertyValue(rtl::OUString::createFromAscii(SW_PROP_NAME_STR(UNO_NAME_LOAD_NUMBERING_STYLES)), -1, aVal, beans::PropertyState_DIRECT_VALUE);
+ aVal.setValue(&bTemp, ::getCppuBooleanType());
+ pArray[4] = beans::PropertyValue(rtl::OUString::createFromAscii(SW_PROP_NAME_STR(UNO_NAME_OVERWRITE_STYLES)), -1, aVal, beans::PropertyState_DIRECT_VALUE);
+ return aSeq;
+}
+
+/******************************************************************
+ * SwXStyleFamily
+ ******************************************************************/
+OUString SwXStyleFamily::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXStyleFamily");
+}
+
+sal_Bool SwXStyleFamily::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ return C2U("com.sun.star.style.StyleFamily") == rServiceName;
+}
+
+uno::Sequence< OUString > SwXStyleFamily::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aRet(1);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.style.StyleFamily");
+ return aRet;
+}
+
+SwXStyleFamily::SwXStyleFamily(SwDocShell* pDocSh, sal_uInt16 nFamily) :
+ eFamily((SfxStyleFamily)nFamily),
+ pBasePool(pDocSh->GetStyleSheetPool()),
+ pDocShell(pDocSh)
+{
+/* switch( nFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ _pPropMap = aSwMapProvider.GetPropertyMap(PROPERTY_MAP_CHAR_STYLE);
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ _pPropMap = aSwMapProvider.GetPropertyMap(PROPERTY_MAP_PARA_STYLE);
+ break;
+ case SFX_STYLE_FAMILY_PAGE:
+ _pPropMap = aSwMapProvider.GetPropertyMap(PROPERTY_MAP_PAGE_STYLE);
+ break;
+ case SFX_STYLE_FAMILY_FRAME:
+ _pPropMap = aSwMapProvider.GetPropertyMap(PROPERTY_MAP_FRAME_STYLE);
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ _pPropMap = aSwMapProvider.GetPropertyMap(PROPERTY_MAP_NUM_STYLE);
+ break;
+ }*/
+ StartListening(*pBasePool);
+}
+
+SwXStyleFamily::~SwXStyleFamily()
+{
+
+}
+
+sal_Int32 lcl_GetCountOrName ( const SwDoc &rDoc, SfxStyleFamily eFamily, String *pString, sal_uInt16 nIndex = USHRT_MAX )
+{
+ sal_Int32 nCount = 0;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ {
+ sal_uInt16 nBaseCount = RES_POOLCHR_HTML_END - RES_POOLCHR_HTML_BEGIN +
+ RES_POOLCHR_NORMAL_END - RES_POOLCHR_NORMAL_BEGIN;
+ nIndex = nIndex - nBaseCount;
+ const sal_uInt16 nArrLen = rDoc.GetCharFmts()->Count();
+ for( sal_uInt16 i = 0; i < nArrLen; i++ )
+ {
+ SwCharFmt* pFmt = (*rDoc.GetCharFmts())[ i ];
+ if( pFmt->IsDefault() && pFmt != rDoc.GetDfltCharFmt() )
+ continue;
+ if ( IsPoolUserFmt ( pFmt->GetPoolFmtId() ) )
+ {
+ if ( nIndex == nCount )
+ {
+ // the default character format needs to be set to "Default!"
+ if(rDoc.GetDfltCharFmt() == pFmt)
+ SwStyleNameMapper::FillUIName(
+ RES_POOLCOLL_STANDARD, *pString );
+ else
+ *pString = pFmt->GetName();
+ break;
+ }
+ nCount++;
+ }
+ }
+ nCount += nBaseCount;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ {
+ sal_uInt16 nBaseCount = RES_POOLCOLL_HTML_END - RES_POOLCOLL_HTML_BEGIN +
+ RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN +
+ RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN +
+ RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
+ RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
+ RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN;
+ nIndex = nIndex - nBaseCount;
+ const sal_uInt16 nArrLen = rDoc.GetTxtFmtColls()->Count();
+ for ( sal_uInt16 i = 0; i < nArrLen; i++ )
+ {
+ SwTxtFmtColl * pColl = (*rDoc.GetTxtFmtColls())[i];
+ if ( pColl->IsDefault() )
+ continue;
+ if ( IsPoolUserFmt ( pColl->GetPoolFmtId() ) )
+ {
+ if ( nIndex == nCount )
+ {
+ *pString = pColl->GetName();
+ break;
+ }
+ nCount++;
+ }
+ }
+ nCount += nBaseCount;
+ }
+ break;
+ case SFX_STYLE_FAMILY_FRAME:
+ {
+ sal_uInt16 nBaseCount = RES_POOLFRM_END - RES_POOLFRM_BEGIN;
+ nIndex = nIndex - nBaseCount;
+ const sal_uInt16 nArrLen = rDoc.GetFrmFmts()->Count();
+ for( sal_uInt16 i = 0; i < nArrLen; i++ )
+ {
+ SwFrmFmt* pFmt = (*rDoc.GetFrmFmts())[ i ];
+ if(pFmt->IsDefault() || pFmt->IsAuto())
+ continue;
+ if ( IsPoolUserFmt ( pFmt->GetPoolFmtId() ) )
+ {
+ if ( nIndex == nCount )
+ {
+ *pString = pFmt->GetName();
+ break;
+ }
+ nCount++;
+ }
+ }
+ nCount += nBaseCount;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PAGE:
+ {
+ sal_uInt16 nBaseCount = RES_POOLPAGE_END - RES_POOLPAGE_BEGIN;
+ nIndex = nIndex - nBaseCount;
+ const sal_uInt16 nArrLen = rDoc.GetPageDescCnt();
+ for(sal_uInt16 i = 0; i < nArrLen; ++i)
+ {
+ const SwPageDesc& rDesc = rDoc.GetPageDesc(i);
+
+ /*if(rDesc.IsDefault() || rDesc.IsAuto())
+ continue;*/
+ if ( IsPoolUserFmt ( rDesc.GetPoolFmtId() ) )
+ {
+ if ( nIndex == nCount )
+ {
+ *pString = rDesc.GetName();
+ break;
+ }
+ nCount++;
+ }
+ }
+ nCount += nBaseCount;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ {
+ sal_uInt16 nBaseCount = RES_POOLNUMRULE_END - RES_POOLNUMRULE_BEGIN;
+ nIndex = nIndex - nBaseCount;
+ const SwNumRuleTbl& rNumTbl = rDoc.GetNumRuleTbl();
+ for(USHORT i = 0; i < rNumTbl.Count(); ++i)
+ {
+ const SwNumRule& rRule = *rNumTbl[ i ];
+ if( rRule.IsAutoRule() )
+ continue;
+ if ( IsPoolUserFmt ( rRule.GetPoolFmtId() ) )
+ {
+ if ( nIndex == nCount )
+ {
+ *pString = rRule.GetName();
+ break;
+ }
+ nCount++;
+ }
+ }
+ nCount += nBaseCount;
+ }
+ break;
+
+ default:
+ ;
+ }
+ return nCount;
+}
+
+sal_Int32 SwXStyleFamily::getCount(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ return lcl_GetCountOrName ( *pDocShell->GetDoc(), eFamily, NULL );
+}
+
+uno::Any SwXStyleFamily::getByIndex(sal_Int32 nTempIndex)
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Any aRet;
+ if ( nTempIndex >= 0 && nTempIndex < USHRT_MAX )
+ {
+ sal_uInt16 nIndex = static_cast < sal_uInt16 > ( nTempIndex );
+ if(pBasePool)
+ {
+ String sStyleName;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ {
+ if ( nIndex < ( RES_POOLCHR_NORMAL_END - RES_POOLCHR_NORMAL_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLCHR_NORMAL_BEGIN + nIndex), sStyleName );
+ else if ( nIndex < ( RES_POOLCHR_HTML_END - RES_POOLCHR_HTML_BEGIN +
+ RES_POOLCHR_NORMAL_END - RES_POOLCHR_NORMAL_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( RES_POOLCHR_HTML_BEGIN
+ - RES_POOLCHR_NORMAL_END + RES_POOLCHR_NORMAL_BEGIN
+ + nIndex, sStyleName );
+ }
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ {
+ if ( nIndex < ( RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLCOLL_TEXT_BEGIN + nIndex), sStyleName );
+ else if ( nIndex < ( RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
+ RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( RES_POOLCOLL_LISTS_BEGIN
+ - RES_POOLCOLL_TEXT_END + RES_POOLCOLL_TEXT_BEGIN
+ + nIndex, sStyleName );
+ else if ( nIndex < ( RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
+ RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
+ RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLCOLL_EXTRA_BEGIN
+ - RES_POOLCOLL_LISTS_END + RES_POOLCOLL_LISTS_BEGIN
+ - RES_POOLCOLL_TEXT_END + RES_POOLCOLL_TEXT_BEGIN
+ + nIndex), sStyleName );
+ else if ( nIndex < ( RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN +
+ RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
+ RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
+ RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLCOLL_REGISTER_BEGIN
+ - RES_POOLCOLL_EXTRA_END + RES_POOLCOLL_EXTRA_BEGIN
+ - RES_POOLCOLL_LISTS_END + RES_POOLCOLL_LISTS_BEGIN
+ - RES_POOLCOLL_TEXT_END + RES_POOLCOLL_TEXT_BEGIN
+ + nIndex), sStyleName );
+ else if ( nIndex < ( RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN +
+ RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN +
+ RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
+ RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
+ RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLCOLL_DOC_BEGIN
+ - RES_POOLCOLL_REGISTER_END + RES_POOLCOLL_REGISTER_BEGIN
+ - RES_POOLCOLL_EXTRA_END + RES_POOLCOLL_EXTRA_BEGIN
+ - RES_POOLCOLL_LISTS_END + RES_POOLCOLL_LISTS_BEGIN
+ - RES_POOLCOLL_TEXT_END + RES_POOLCOLL_TEXT_BEGIN
+ + nIndex), sStyleName );
+ else if ( nIndex < ( RES_POOLCOLL_HTML_END - RES_POOLCOLL_HTML_BEGIN +
+ RES_POOLCOLL_DOC_END - RES_POOLCOLL_DOC_BEGIN +
+ RES_POOLCOLL_REGISTER_END - RES_POOLCOLL_REGISTER_BEGIN +
+ RES_POOLCOLL_EXTRA_END - RES_POOLCOLL_EXTRA_BEGIN +
+ RES_POOLCOLL_LISTS_END - RES_POOLCOLL_LISTS_BEGIN +
+ RES_POOLCOLL_TEXT_END - RES_POOLCOLL_TEXT_BEGIN ) )
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLCOLL_HTML_BEGIN
+ - RES_POOLCOLL_DOC_END + RES_POOLCOLL_DOC_BEGIN
+ - RES_POOLCOLL_REGISTER_END + RES_POOLCOLL_REGISTER_BEGIN
+ - RES_POOLCOLL_EXTRA_END + RES_POOLCOLL_EXTRA_BEGIN
+ - RES_POOLCOLL_LISTS_END + RES_POOLCOLL_LISTS_BEGIN
+ - RES_POOLCOLL_TEXT_END + RES_POOLCOLL_TEXT_BEGIN
+ + nIndex), sStyleName );
+ }
+ break;
+ case SFX_STYLE_FAMILY_FRAME:
+ {
+ if ( nIndex < ( RES_POOLFRM_END - RES_POOLFRM_BEGIN ) )
+ {
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLFRM_BEGIN + nIndex), sStyleName );
+ }
+ }
+ break;
+ case SFX_STYLE_FAMILY_PAGE:
+ {
+ if ( nIndex < ( RES_POOLPAGE_END - RES_POOLPAGE_BEGIN ) )
+ {
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLPAGE_BEGIN + nIndex), sStyleName );
+ }
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ {
+ if ( nIndex < ( RES_POOLNUMRULE_END - RES_POOLNUMRULE_BEGIN ) )
+ {
+ SwStyleNameMapper::FillUIName ( static_cast< sal_uInt16 >(RES_POOLNUMRULE_BEGIN + nIndex), sStyleName );
+ }
+ }
+ break;
+
+ default:
+ ;
+ }
+ if ( !sStyleName.Len() )
+ lcl_GetCountOrName ( *pDocShell->GetDoc(), eFamily, &sStyleName, nIndex );
+
+ if ( sStyleName.Len() )
+ {
+ SfxStyleSheetBase* pBase = pBasePool->Find( sStyleName, eFamily );
+ if(pBase)
+ {
+ uno::Reference< style::XStyle > xStyle = _FindStyle(sStyleName);
+ if(!xStyle.is())
+ {
+ xStyle = eFamily == SFX_STYLE_FAMILY_PAGE ?
+ new SwXPageStyle(*pBasePool, pDocShell, eFamily, sStyleName) :
+ eFamily == SFX_STYLE_FAMILY_FRAME ?
+ new SwXFrameStyle(*pBasePool, pDocShell->GetDoc(), pBase->GetName()):
+ new SwXStyle(*pBasePool, eFamily, pDocShell->GetDoc(), sStyleName);
+ }
+ aRet.setValue(&xStyle, ::getCppuType((uno::Reference<style::XStyle>*)0));
+ }
+ else
+ throw container::NoSuchElementException();
+ }
+ else
+ throw lang::IndexOutOfBoundsException();
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ else
+ throw lang::IndexOutOfBoundsException();
+
+ return aRet;
+}
+
+uno::Any SwXStyleFamily::getByName(const OUString& rName)
+ throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Any aRet;
+ String sStyleName;
+ SwStyleNameMapper::FillUIName(rName, sStyleName, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ if(pBase)
+ {
+ uno::Reference< style::XStyle > xStyle = _FindStyle(sStyleName);
+ if(!xStyle.is())
+ {
+ xStyle = eFamily == SFX_STYLE_FAMILY_PAGE ?
+ new SwXPageStyle(*pBasePool, pDocShell, eFamily, sStyleName) :
+ eFamily == SFX_STYLE_FAMILY_FRAME ?
+ new SwXFrameStyle(*pBasePool, pDocShell->GetDoc(), pBase->GetName()):
+ new SwXStyle(*pBasePool, eFamily, pDocShell->GetDoc(), sStyleName);
+ }
+ aRet.setValue(&xStyle, ::getCppuType((uno::Reference<style::XStyle>*)0));
+ }
+ else
+ throw container::NoSuchElementException();
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+
+}
+
+uno::Sequence< OUString > SwXStyleFamily::getElementNames(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Sequence< OUString > aRet;
+ if(pBasePool)
+ {
+ SfxStyleSheetIterator* pIterator = pBasePool->CreateIterator(eFamily, 0xffff);
+ sal_uInt16 nCount = pIterator->Count();
+ aRet.realloc(nCount);
+ OUString* pArray = aRet.getArray();
+ String aString;
+ for(sal_uInt16 i = 0; i < nCount; i++)
+ {
+ SwStyleNameMapper::FillProgName((*pIterator)[i]->GetName(), aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+ pArray[i] = OUString ( aString );
+ }
+ delete pIterator;
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+
+sal_Bool SwXStyleFamily::hasByName(const OUString& rName) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ sal_Bool bRet = sal_False;
+ if(pBasePool)
+ {
+ String sStyleName;
+ SwStyleNameMapper::FillUIName(rName, sStyleName, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ bRet = 0 != pBase;
+ }
+ else
+ throw uno::RuntimeException();
+ return bRet;
+
+}
+
+uno::Type SwXStyleFamily::getElementType(void) throw( uno::RuntimeException )
+{
+ return ::getCppuType((const uno::Reference<style::XStyle>*)0);
+
+}
+
+sal_Bool SwXStyleFamily::hasElements(void) throw( uno::RuntimeException )
+{
+ if(!pBasePool)
+ throw uno::RuntimeException();
+ return sal_True;
+}
+
+void SwXStyleFamily::insertByName(const OUString& rName, const uno::Any& rElement)
+ throw( lang::IllegalArgumentException, container::ElementExistException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(pBasePool)
+ {
+ String sStyleName;
+ SwStyleNameMapper::FillUIName(rName, sStyleName, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True);
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ SfxStyleSheetBase* pUINameBase = pBasePool->Find( sStyleName );
+ if(pBase || pUINameBase)
+ throw container::ElementExistException();
+ else
+ {
+ if(rElement.getValueType().getTypeClass() ==
+ uno::TypeClass_INTERFACE)
+ {
+ uno::Reference< uno::XInterface > * pxRef =
+ (uno::Reference< uno::XInterface > *)rElement.getValue();
+
+ uno::Reference<lang::XUnoTunnel> xStyleTunnel( *pxRef, uno::UNO_QUERY);
+
+ SwXStyle* pNewStyle = 0;
+ if(xStyleTunnel.is())
+ {
+ pNewStyle = reinterpret_cast< SwXStyle * >(
+ sal::static_int_cast< sal_IntPtr >( xStyleTunnel->getSomething( SwXStyle::getUnoTunnelId()) ));
+ }
+ if(!pNewStyle || !pNewStyle->IsDescriptor() ||
+ pNewStyle->GetFamily() != eFamily)
+ throw lang::IllegalArgumentException();
+ if(pNewStyle)
+ {
+ sal_uInt16 nMask = 0xffff;
+ if(eFamily == SFX_STYLE_FAMILY_PARA && !pNewStyle->IsConditional())
+ nMask &= ~SWSTYLEBIT_CONDCOLL;
+#if OSL_DEBUG_LEVEL > 1
+ SfxStyleSheetBase& rNewBase =
+#endif
+ pBasePool->Make(sStyleName, eFamily, nMask);
+ pNewStyle->SetDoc(pDocShell->GetDoc(), pBasePool);
+ pNewStyle->SetStyleName(sStyleName);
+ String sParentStyleName(pNewStyle->GetParentStyleName());
+ if(sParentStyleName.Len())
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pParentBase = pBasePool->Find(sParentStyleName);
+ if(pParentBase && pParentBase->GetFamily() == eFamily &&
+ &pParentBase->GetPool() == pBasePool)
+ pBasePool->SetParent( eFamily, sStyleName, sParentStyleName );
+
+ }
+#if OSL_DEBUG_LEVEL > 1
+ (void)rNewBase;
+#endif
+ //so, jetzt sollten noch die Properties des Descriptors angewandt werden
+ pNewStyle->ApplyDescriptorProperties();
+ }
+ else
+ throw lang::IllegalArgumentException();
+ }
+ else
+ throw lang::IllegalArgumentException();
+ }
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+void SwXStyleFamily::replaceByName(const OUString& rName, const uno::Any& rElement)
+ throw( lang::IllegalArgumentException, container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily);
+ SfxStyleSheetBase* pBase = pBasePool->Find(rName);
+ //Ersetzung geht nur fuer benutzerdefinierte Styles
+ if(!pBase)
+ throw container::NoSuchElementException();
+ if(!pBase->IsUserDefined())
+ throw lang::IllegalArgumentException();
+ //if theres an object available to this style then it must be invalidated
+ uno::Reference< style::XStyle > xStyle = _FindStyle(pBase->GetName());
+ if(xStyle.is())
+ {
+ uno::Reference<lang::XUnoTunnel> xTunnel( xStyle, uno::UNO_QUERY);
+ if(xTunnel.is())
+ {
+ SwXStyle* pStyle = reinterpret_cast< SwXStyle * >(
+ sal::static_int_cast< sal_IntPtr >( xTunnel->getSomething( SwXStyle::getUnoTunnelId()) ));
+ pStyle->Invalidate();
+ }
+ }
+
+ pBasePool->Remove(pBase);
+ insertByName(rName, rElement);
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+void SwXStyleFamily::removeByName(const OUString& rName) throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ String aString;
+ SwStyleNameMapper::FillUIName(rName, aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+
+ SfxStyleSheetBase* pBase = pBasePool->Find( aString );
+ if(pBase)
+ pBasePool->Remove(pBase);
+ else
+ throw container::NoSuchElementException();
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+uno::Reference< beans::XPropertySetInfo > SAL_CALL SwXStyleFamily::getPropertySetInfo( ) throw (uno::RuntimeException)
+{
+ OSL_ENSURE( 0, "###unexpected!" );
+ return uno::Reference< beans::XPropertySetInfo >();
+}
+
+void SAL_CALL SwXStyleFamily::setPropertyValue( const ::rtl::OUString&, const uno::Any& ) throw (beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ OSL_ENSURE( 0, "###unexpected!" );
+}
+
+uno::Any SAL_CALL SwXStyleFamily::getPropertyValue( const ::rtl::OUString& sPropertyName ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ uno::Any aRet;
+
+ if ( sPropertyName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM("DisplayName") ) )
+ {
+ SolarMutexGuard aGuard;
+ sal_uInt32 nResId = 0;
+ switch ( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ nResId = STR_STYLE_FAMILY_CHARACTER; break;
+ case SFX_STYLE_FAMILY_PARA:
+ nResId = STR_STYLE_FAMILY_PARAGRAPH; break;
+ case SFX_STYLE_FAMILY_FRAME:
+ nResId = STR_STYLE_FAMILY_FRAME; break;
+ case SFX_STYLE_FAMILY_PAGE:
+ nResId = STR_STYLE_FAMILY_PAGE; break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ nResId = STR_STYLE_FAMILY_NUMBERING; break;
+ default:
+ OSL_ENSURE( 0, "SwXStyleFamily::getPropertyValue(): invalid family" );
+ }
+ if ( nResId > 0 )
+ {
+ OUString sDisplayName( String( SW_RES( nResId ) ) );
+ aRet = uno::makeAny( sDisplayName );
+ }
+ }
+ else
+ {
+ throw beans::UnknownPropertyException( OUString( RTL_CONSTASCII_USTRINGPARAM("unknown property: ") ) + sPropertyName, static_cast<OWeakObject *>(this) );
+ }
+
+ return aRet;
+}
+
+void SAL_CALL SwXStyleFamily::addPropertyChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ OSL_ENSURE( 0, "###unexpected!" );
+}
+
+void SAL_CALL SwXStyleFamily::removePropertyChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XPropertyChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ OSL_ENSURE( 0, "###unexpected!" );
+}
+
+void SAL_CALL SwXStyleFamily::addVetoableChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ OSL_ENSURE( 0, "###unexpected!" );
+}
+
+void SAL_CALL SwXStyleFamily::removeVetoableChangeListener( const ::rtl::OUString&, const uno::Reference< beans::XVetoableChangeListener >& ) throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ OSL_ENSURE( 0, "###unexpected!" );
+}
+
+void SwXStyleFamily::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
+{
+ SfxSimpleHint *pHint = PTR_CAST( SfxSimpleHint, &rHint );
+ if( pHint && ( pHint->GetId() & SFX_HINT_DYING ) )
+ {
+ pBasePool = 0;
+ pDocShell = 0;
+ EndListening(rBC);
+ }
+}
+
+SwXStyle* SwXStyleFamily::_FindStyle(const String& rStyleName)const
+{
+ sal_uInt16 nLCount = pBasePool->GetListenerCount();
+ SfxListener* pListener = 0;
+ for( sal_uInt16 i = 0; i < nLCount; i++)
+ {
+ pListener = pBasePool->GetListener( i );
+ SwXStyle* pTempStyle = dynamic_cast<SwXStyle*>( pListener );
+ if(pTempStyle && pTempStyle->GetFamily() == eFamily && pTempStyle->GetStyleName() == rStyleName)
+ {
+ return pTempStyle;
+ }
+ }
+ return 0;
+}
+
+class SwStyleProperties_Impl
+{
+ const PropertyEntryVector_t aPropertyEntries;
+ uno::Any** pAnyArr;
+ sal_uInt32 nArrLen;
+
+public:
+ SwStyleProperties_Impl(const SfxItemPropertyMap* _pMap);
+ ~SwStyleProperties_Impl();
+
+ sal_Bool SetProperty(const ::rtl::OUString& rName, uno::Any aVal);
+ sal_Bool GetProperty(const ::rtl::OUString& rName, uno::Any*& rpAny);
+ sal_Bool ClearProperty( const ::rtl::OUString& rPropertyName );
+ void ClearAllProperties( );
+ void GetProperty(const ::rtl::OUString &rPropertyName, const uno::Reference < beans::XPropertySet > &rxPropertySet, uno::Any& rAny );
+
+ const PropertyEntryVector_t& GetPropertyVector() const {return aPropertyEntries; }
+
+};
+
+SwStyleProperties_Impl::SwStyleProperties_Impl(const SfxItemPropertyMap* pMap) :
+// _pMap(pMap),
+ aPropertyEntries( pMap->getPropertyEntries() ),
+ nArrLen(0)
+{
+ nArrLen = aPropertyEntries.size();
+ //const SfxItemPropertyMap* pTmp = _pMap;
+
+ pAnyArr = new uno::Any* [nArrLen];
+ for ( sal_uInt32 i =0 ; i < nArrLen; i++ )
+ pAnyArr[i] = 0;
+}
+
+SwStyleProperties_Impl::~SwStyleProperties_Impl()
+{
+ for ( sal_uInt16 i =0 ; i < nArrLen; i++ )
+ delete pAnyArr[i];
+ delete[] pAnyArr;
+}
+
+sal_Bool SwStyleProperties_Impl::SetProperty(const ::rtl::OUString& rName, uno::Any aVal)
+{
+ sal_uInt16 nPos = 0;
+ sal_Bool bRet = sal_False;
+ PropertyEntryVector_t::const_iterator aIt = aPropertyEntries.begin();
+ while( aIt != aPropertyEntries.end() )
+ {
+ if(rName == aIt->sName)
+ {
+ delete pAnyArr[nPos];
+ pAnyArr[nPos] = new uno::Any ( aVal );
+ bRet = sal_True;
+ break;
+ }
+ ++nPos;
+ ++aIt;
+ }
+ return bRet;
+}
+
+sal_Bool SwStyleProperties_Impl::ClearProperty( const OUString& rName )
+{
+ sal_Bool bRet = sal_False;
+ sal_uInt16 nPos = 0;
+ PropertyEntryVector_t::const_iterator aIt = aPropertyEntries.begin();
+ while( aIt != aPropertyEntries.end() )
+ {
+ if( rName == aIt->sName )
+ {
+ delete pAnyArr[nPos];
+ pAnyArr[ nPos ] = 0;
+ bRet = sal_True;
+ break;
+ }
+ ++nPos;
+ ++aIt;
+ }
+ return bRet;
+}
+
+void SwStyleProperties_Impl::ClearAllProperties( )
+{
+ for ( sal_uInt16 i = 0; i < nArrLen; i++ )
+ {
+ delete pAnyArr[i];
+ pAnyArr[ i ] = 0;
+ }
+}
+
+sal_Bool SwStyleProperties_Impl::GetProperty(const ::rtl::OUString& rName, uno::Any*& rpAny )
+{
+ sal_Bool bRet = sal_False;
+ sal_uInt16 nPos = 0;
+ PropertyEntryVector_t::const_iterator aIt = aPropertyEntries.begin();
+ while( aIt != aPropertyEntries.end() )
+ {
+ if( rName == aIt->sName )
+ {
+ rpAny = pAnyArr[nPos];
+ bRet = sal_True;
+ break;
+ }
+ ++nPos;
+ ++aIt;
+ }
+
+ return bRet;
+}
+
+void SwStyleProperties_Impl::GetProperty( const OUString &rPropertyName, const uno::Reference < beans::XPropertySet > &rxPropertySet, uno::Any & rAny )
+{
+ rAny = rxPropertySet->getPropertyValue( rPropertyName );
+}
+
+const uno::Sequence< sal_Int8 > & SwXStyle::getUnoTunnelId()
+{
+ static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId();
+ return aSeq;
+}
+
+sal_Int64 SAL_CALL SwXStyle::getSomething( const uno::Sequence< sal_Int8 >& rId )
+ throw(uno::RuntimeException)
+{
+ if( rId.getLength() == 16
+ && 0 == rtl_compareMemory( getUnoTunnelId().getConstArray(),
+ rId.getConstArray(), 16 ) )
+ {
+ return sal::static_int_cast< sal_Int64 >( reinterpret_cast< sal_IntPtr >(this) );
+ }
+ return 0;
+}
+
+TYPEINIT1(SwXStyle, SfxListener);
+
+OUString SwXStyle::getImplementationName(void) throw( uno::RuntimeException )
+{
+ return C2U("SwXStyle");
+}
+
+sal_Bool SwXStyle::supportsService(const OUString& rServiceName) throw( uno::RuntimeException )
+{
+ sal_Bool bRet = C2U("com.sun.star.style.Style") == rServiceName;
+ if(!bRet && SFX_STYLE_FAMILY_CHAR == eFamily)
+ bRet = !rServiceName.compareToAscii("com.sun.star.style.CharacterStyle")||
+ !rServiceName.compareToAscii("com.sun.star.style.CharacterProperties")||
+ !rServiceName.compareToAscii("com.sun.star.style.CharacterPropertiesAsian")||
+ !rServiceName.compareToAscii("com.sun.star.style.CharacterPropertiesComplex");
+ if(!bRet && SFX_STYLE_FAMILY_PARA == eFamily)
+ bRet = (C2U("com.sun.star.style.ParagraphStyle") == rServiceName)||
+ (C2U("com.sun.star.style.ParagraphProperties") == rServiceName) ||
+ (C2U("com.sun.star.style.ParagraphPropertiesAsian") == rServiceName) ||
+ (C2U("com.sun.star.style.ParagraphPropertiesComplex") == rServiceName);
+ if(!bRet && SFX_STYLE_FAMILY_PAGE == eFamily)
+ bRet = (C2U("com.sun.star.style.PageStyle") == rServiceName)||
+ (C2U("com.sun.star.style.PageProperties") == rServiceName);
+
+ return bRet;
+}
+
+uno::Sequence< OUString > SwXStyle::getSupportedServiceNames(void) throw( uno::RuntimeException )
+{
+ long nCount = 1;
+ if(SFX_STYLE_FAMILY_PARA == eFamily)
+ {
+ nCount = 5;
+ if(bIsConditional)
+ nCount++;
+ }
+ else if(SFX_STYLE_FAMILY_CHAR == eFamily)
+ nCount = 5;
+ else if(SFX_STYLE_FAMILY_PAGE == eFamily)
+ nCount = 3;
+ uno::Sequence< OUString > aRet(nCount);
+ OUString* pArray = aRet.getArray();
+ pArray[0] = C2U("com.sun.star.style.Style");
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ pArray[1] = C2U("com.sun.star.style.CharacterStyle");
+ pArray[2] = C2U("com.sun.star.style.CharacterProperties");
+ pArray[3] = C2U("com.sun.star.style.CharacterPropertiesAsian");
+ pArray[4] = C2U("com.sun.star.style.CharacterPropertiesComplex");
+ break;
+ case SFX_STYLE_FAMILY_PAGE:
+ pArray[1] = C2U("com.sun.star.style.PageStyle");
+ pArray[2] = C2U("com.sun.star.style.PageProperties");
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ pArray[1] = C2U("com.sun.star.style.ParagraphStyle");
+ pArray[2] = C2U("com.sun.star.style.ParagraphProperties");
+ pArray[3] = C2U("com.sun.star.style.ParagraphPropertiesAsian");
+ pArray[4] = C2U("com.sun.star.style.ParagraphPropertiesComplex");
+ if(bIsConditional)
+ pArray[5] = C2U("com.sun.star.style.ConditionalParagraphStyle");
+ break;
+
+ default:
+ ;
+ }
+ return aRet;
+}
+
+SwXStyle::SwXStyle( SwDoc *pDoc, SfxStyleFamily eFam, BOOL bConditional) :
+ m_pDoc( pDoc ),
+ pBasePool(0),
+ eFamily(eFam),
+ bIsDescriptor(sal_True),
+ bIsConditional(bConditional)
+{
+ // Register ourselves as a listener to the document (via the page descriptor)
+ pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+ // get the property set for the default style data
+ // First get the model
+ uno::Reference < frame::XModel > xModel = pDoc->GetDocShell()->GetBaseModel();
+ // Ask the model for it's family supplier interface
+ uno::Reference < style::XStyleFamiliesSupplier > xFamilySupplier ( xModel, uno::UNO_QUERY );
+ // Get the style families
+ uno::Reference < container::XNameAccess > xFamilies = xFamilySupplier->getStyleFamilies();
+
+ uno::Any aAny;
+ sal_uInt16 nMapId = PROPERTY_MAP_NUM_STYLE;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ {
+ nMapId = PROPERTY_MAP_CHAR_STYLE;
+ aAny = xFamilies->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "CharacterStyles" ) ) );
+ // Get the Frame family (and keep it for later)
+ aAny >>= mxStyleFamily;
+ //aAny = mxStyleFamily->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Standard" ) ) );
+ //aAny >>= mxStyleData;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ {
+ nMapId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE;
+ aAny = xFamilies->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "ParagraphStyles" ) ) );
+ // Get the Frame family (and keep it for later)
+ aAny >>= mxStyleFamily;
+ aAny = mxStyleFamily->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Standard" ) ) );
+ aAny >>= mxStyleData;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PAGE:
+ {
+ nMapId = PROPERTY_MAP_PAGE_STYLE;
+ aAny = xFamilies->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "PageStyles" ) ) );
+ // Get the Frame family (and keep it for later)
+ aAny >>= mxStyleFamily;
+ aAny = mxStyleFamily->getByName ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Standard" ) ) );
+ aAny >>= mxStyleData;
+ }
+ break;
+ case SFX_STYLE_FAMILY_FRAME :
+ {
+ nMapId = PROPERTY_MAP_FRAME_STYLE;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ {
+ nMapId = PROPERTY_MAP_NUM_STYLE;
+ }
+ break;
+
+ default:
+ ;
+ }
+ pPropImpl = new SwStyleProperties_Impl(aSwMapProvider.GetPropertySet(nMapId)->getPropertyMap());
+}
+
+SwXStyle::SwXStyle(SfxStyleSheetBasePool& rPool, SfxStyleFamily eFam,
+ SwDoc* pDoc, const String& rStyleName) :
+ m_pDoc(pDoc),
+ sStyleName(rStyleName),
+ pBasePool(&rPool),
+ eFamily(eFam),
+ bIsDescriptor(sal_False),
+ bIsConditional(sal_False),
+ pPropImpl(0)
+{
+ StartListening(rPool);
+ if(eFam == SFX_STYLE_FAMILY_PARA)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "where is the style?" );
+ if(pBase)
+ {
+ const sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName(sStyleName, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL);
+ if(nId != USHRT_MAX)
+ bIsConditional = ::IsConditionalByPoolId( nId );
+ else
+ bIsConditional = RES_CONDTXTFMTCOLL == ((SwDocStyleSheet*)pBase)->GetCollection()->Which();
+ }
+ }
+}
+
+SwXStyle::~SwXStyle()
+{
+ if(pBasePool)
+ EndListening(*pBasePool);
+ delete pPropImpl;
+}
+
+void SwXStyle::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ {
+ m_pDoc = 0;
+ mxStyleData.clear();
+ mxStyleFamily.clear();
+ }
+}
+
+OUString SwXStyle::getName(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ String aString;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "where is the style?" );
+ if(!pBase)
+ throw uno::RuntimeException();
+ SwStyleNameMapper::FillProgName(pBase->GetName(), aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True);
+ }
+ else
+ aString = sStyleName;
+ return OUString (aString);
+}
+
+void SwXStyle::setName(const OUString& rName) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "where is the style?" );
+ sal_Bool bExcept = sal_True;
+ if(pBase && pBase->IsUserDefined())
+ {
+ rtl::Reference< SwDocStyleSheet > xTmp( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+ bExcept = !xTmp->SetName(rName);
+ if(!bExcept)
+ sStyleName = String(rName);
+ }
+ if(bExcept)
+ throw uno::RuntimeException();
+ }
+ else
+ sStyleName = String(rName);
+}
+
+sal_Bool SwXStyle::isUserDefined(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ sal_Bool bRet = sal_False;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ //if it is not found it must be non user defined
+ if(pBase)
+ bRet = pBase->IsUserDefined();
+ }
+ else
+ throw uno::RuntimeException();
+ return bRet;
+}
+
+sal_Bool SwXStyle::isInUse(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ sal_Bool bRet = sal_False;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_USED);
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ if(pBase)
+ bRet = pBase->IsUsed();
+ }
+ else
+ throw uno::RuntimeException();
+ return bRet;
+}
+
+OUString SwXStyle::getParentStyle(void) throw( uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ String aString;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL);
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ if(pBase)
+ aString = pBase->GetParent();
+ }
+ else if(bIsDescriptor)
+ aString = sParentStyleName;
+ else
+ throw uno::RuntimeException();
+ SwStyleNameMapper::FillProgName(aString, aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+ return OUString ( aString );
+}
+
+void SwXStyle::setParentStyle(const OUString& rParentStyle)
+ throw( container::NoSuchElementException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ String sParentStyle;
+ SwStyleNameMapper::FillUIName(rParentStyle, sParentStyle, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily);
+ BOOL bExcept = FALSE;
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ if(pBase)
+ {
+ rtl::Reference< SwDocStyleSheet > xBase( new SwDocStyleSheet(*(SwDocStyleSheet*)pBase) );
+ //make it a 'real' style - necessary for pooled styles
+ xBase->GetItemSet();
+ if(xBase->GetParent() != sParentStyle)
+ {
+ bExcept = !xBase->SetParent(sParentStyle);
+ }
+ }
+ else
+ bExcept = TRUE;
+ if(bExcept)
+ throw uno::RuntimeException();
+ }
+ else if(bIsDescriptor)
+ {
+ sParentStyleName = String(sParentStyle);
+ try
+ {
+ uno::Any aAny = mxStyleFamily->getByName ( sParentStyle );
+ aAny >>= mxStyleData;
+ }
+ catch ( container::NoSuchElementException& )
+ {
+ }
+ catch ( lang::WrappedTargetException& )
+ {
+ }
+ catch ( uno::RuntimeException& )
+ {
+ }
+ }
+ else
+ throw uno::RuntimeException();
+}
+
+uno::Reference< beans::XPropertySetInfo > lcl_getPropertySetInfo( SfxStyleFamily eFamily, sal_Bool bIsConditional )
+{
+ uno::Reference< beans::XPropertySetInfo > xRet;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR:
+ {
+ static uno::Reference< beans::XPropertySetInfo > xCharRef;
+ if(!xCharRef.is())
+ {
+ xCharRef = aSwMapProvider.GetPropertySet(PROPERTY_MAP_CHAR_STYLE)->getPropertySetInfo();
+ }
+ xRet = xCharRef;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ {
+ static uno::Reference< beans::XPropertySetInfo > xParaRef;
+ if(!xParaRef.is())
+ {
+ sal_uInt16 nMapId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE;
+ xParaRef = aSwMapProvider.GetPropertySet(nMapId)->getPropertySetInfo();
+ }
+ xRet = xParaRef;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PAGE :
+ {
+ static uno::Reference< beans::XPropertySetInfo > xPageRef;
+ if(!xPageRef.is())
+ {
+ xPageRef = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PAGE_STYLE)->getPropertySetInfo();
+ }
+ xRet = xPageRef;
+ }
+ break;
+ case SFX_STYLE_FAMILY_FRAME :
+ {
+ static uno::Reference< beans::XPropertySetInfo > xFrameRef;
+ if(!xFrameRef.is())
+ {
+ xFrameRef = aSwMapProvider.GetPropertySet(PROPERTY_MAP_FRAME_STYLE)->getPropertySetInfo();
+ }
+ xRet = xFrameRef;
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ {
+ static uno::Reference< beans::XPropertySetInfo > xNumRef;
+ if(!xNumRef.is())
+ {
+ xNumRef = aSwMapProvider.GetPropertySet(PROPERTY_MAP_NUM_STYLE)->getPropertySetInfo();
+ }
+ xRet = xNumRef;
+ }
+ break;
+
+ default:
+ ;
+ }
+ return xRet;
+}
+
+uno::Reference< beans::XPropertySetInfo > SwXStyle::getPropertySetInfo(void)
+ throw( uno::RuntimeException )
+{
+ return lcl_getPropertySetInfo( eFamily, bIsConditional );
+}
+
+void SwXStyle::ApplyDescriptorProperties()
+{
+ bIsDescriptor = sal_False;
+ mxStyleData.clear();
+ mxStyleFamily.clear();
+
+ const PropertyEntryVector_t& rPropertyVector = pPropImpl->GetPropertyVector();
+ PropertyEntryVector_t::const_iterator aIt = rPropertyVector.begin();
+ while(aIt != rPropertyVector.end())
+ {
+ uno::Any* pAny;
+ pPropImpl->GetProperty(aIt->sName, pAny);
+ if(pAny)
+ setPropertyValue(aIt->sName, *pAny);
+ ++aIt;
+ }
+}
+
+struct SwStyleBase_Impl
+{
+ SwDoc& rDoc;
+
+ const SwPageDesc* pOldPageDesc;
+
+ rtl::Reference< SwDocStyleSheet > mxNewBase;
+ SfxItemSet* pItemSet;
+
+ const String& rStyleName;
+ sal_uInt16 nPDescPos;
+
+ SwStyleBase_Impl(SwDoc& rSwDoc, const String& rName) :
+ rDoc(rSwDoc),
+ pOldPageDesc(0),
+ pItemSet(0),
+ rStyleName(rName),
+ nPDescPos(0xffff)
+ {}
+
+ ~SwStyleBase_Impl(){ delete pItemSet; }
+
+ sal_Bool HasItemSet() {return mxNewBase.is();}
+ SfxItemSet& GetItemSet()
+ {
+ DBG_ASSERT(mxNewBase.is(), "no SwDocStyleSheet available");
+ if(!pItemSet)
+ pItemSet = new SfxItemSet(mxNewBase->GetItemSet());
+ return *pItemSet;
+ }
+
+ const SwPageDesc& GetOldPageDesc();
+};
+
+const SwPageDesc& SwStyleBase_Impl::GetOldPageDesc()
+{
+ if(!pOldPageDesc)
+ {
+ sal_uInt16 i;
+ sal_uInt16 nPDescCount = rDoc.GetPageDescCnt();
+ for(i = 0; i < nPDescCount; i++)
+ {
+ const SwPageDesc& rDesc =
+ const_cast<const SwDoc &>(rDoc).GetPageDesc( i );
+ if(rDesc.GetName() == rStyleName)
+ {
+ pOldPageDesc = & rDesc;
+ nPDescPos = i;
+ break;
+ }
+ }
+ if(!pOldPageDesc)
+ {
+ for(i = RC_POOLPAGEDESC_BEGIN; i <= STR_POOLPAGE_LANDSCAPE; ++i)
+ {
+ const String aFmtName(SW_RES(i));
+ if(aFmtName == rStyleName)
+ {
+ pOldPageDesc = rDoc.GetPageDescFromPool( static_cast< sal_uInt16 >(RES_POOLPAGE_BEGIN + i - RC_POOLPAGEDESC_BEGIN) );
+ break;
+ }
+ }
+ for(i = 0; i < nPDescCount + 1; i++)
+ {
+ const SwPageDesc& rDesc =
+ const_cast<const SwDoc &>(rDoc).GetPageDesc( i );
+ if(rDesc.GetName() == rStyleName)
+ {
+ nPDescPos = i;
+ break;
+ }
+ }
+ }
+ }
+ return *pOldPageDesc;
+}
+
+void lcl_SetStyleProperty(const SfxItemPropertySimpleEntry& rEntry,
+ const SfxItemPropertySet& rPropSet,
+ const uno::Any& rValue,
+ SwStyleBase_Impl& rBase,
+ SfxStyleSheetBasePool* pBasePool,
+ SwDoc* pDoc,
+ SfxStyleFamily eFamily)
+ throw(beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException)
+
+{
+ switch(rEntry.nWID)
+ {
+ case RES_PAPER_BIN:
+ {
+ SfxPrinter *pPrinter = pDoc->getPrinter( true );
+ OUString sTmp;
+ sal_uInt16 nBin = USHRT_MAX;
+ if ( !( rValue >>= sTmp ) )
+ throw lang::IllegalArgumentException();
+ if ( sTmp.equalsAsciiL ( RTL_CONSTASCII_STRINGPARAM ( "[From printer settings]" ) ) )
+ nBin = USHRT_MAX-1;
+ else if ( pPrinter )
+ {
+ for (sal_uInt16 i=0, nEnd = pPrinter->GetPaperBinCount(); i < nEnd; i++ )
+ {
+ if (sTmp == OUString ( pPrinter->GetPaperBinName ( i ) ) )
+ {
+ nBin = i;
+ break;
+ }
+ }
+ }
+ if ( nBin == USHRT_MAX )
+ throw lang::IllegalArgumentException();
+ else
+ {
+ SfxItemSet& rStyleSet = rBase.GetItemSet();
+ SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID);
+ aSet.SetParent(&rStyleSet);
+ rPropSet.setPropertyValue(rEntry, uno::makeAny ( static_cast < sal_Int8 > ( nBin == USHRT_MAX-1 ? -1 : nBin ) ), aSet);
+ rStyleSet.Put(aSet);
+ }
+ }
+ break;
+ case FN_UNO_NUM_RULES: //Sonderbehandlung fuer das SvxNumRuleItem:
+ {
+ if(rValue.getValueType() == ::getCppuType((uno::Reference< container::XIndexReplace>*)0) )
+ {
+ uno::Reference< container::XIndexReplace > * pxRulesRef =
+ (uno::Reference< container::XIndexReplace > *)rValue.getValue();
+
+ uno::Reference<lang::XUnoTunnel> xNumberTunnel( *pxRulesRef, uno::UNO_QUERY);
+
+ SwXNumberingRules* pSwXRules = 0;
+ if(xNumberTunnel.is())
+ {
+ pSwXRules = reinterpret_cast< SwXNumberingRules * >(
+ sal::static_int_cast< sal_IntPtr >(xNumberTunnel->getSomething( SwXNumberingRules::getUnoTunnelId()) ));
+ }
+ if(pSwXRules)
+ {
+ const String* pCharStyleNames = pSwXRules->GetNewCharStyleNames();
+ const String* pBulletFontNames = pSwXRules->GetBulletFontNames();
+
+ SwNumRule aSetRule(*pSwXRules->GetNumRule());
+ const SwCharFmts* pFmts = pDoc->GetCharFmts();
+ sal_uInt16 nChCount = pFmts->Count();
+ for(sal_uInt16 i = 0; i < MAXLEVEL; i++)
+ {
+
+ const SwNumFmt* pFmt = aSetRule.GetNumFmt( i );
+ if(pFmt)
+ {
+ SwNumFmt aFmt(*pFmt);
+ if(
+ pCharStyleNames[i] != SwXNumberingRules::GetInvalidStyle() &&
+ ((pCharStyleNames[i].Len() && !pFmt->GetCharFmt()) ||
+ (pCharStyleNames[i].Len() &&
+ pFmt->GetCharFmt()->GetName() != pCharStyleNames[i]) ))
+ {
+
+ SwCharFmt* pCharFmt = 0;
+ if(pCharStyleNames[i].Len())
+ {
+ for(sal_uInt16 j = 0; j< nChCount; j++)
+ {
+ SwCharFmt* pTmp = (*pFmts)[j];
+ if(pTmp->GetName() == pCharStyleNames[i])
+ {
+ pCharFmt = pTmp;
+ break;
+ }
+ }
+ if(!pCharFmt)
+ {
+
+ SfxStyleSheetBase* pBase;
+ pBase = ((SfxStyleSheetBasePool*)pBasePool)->Find(pCharStyleNames[i], SFX_STYLE_FAMILY_CHAR);
+ if(!pBase)
+ pBase = &pBasePool->Make(pCharStyleNames[i], SFX_STYLE_FAMILY_CHAR);
+ pCharFmt = ((SwDocStyleSheet*)pBase)->GetCharFmt();
+
+ }
+
+ aFmt.SetCharFmt( pCharFmt );
+ }
+ }
+ //jetzt nochmal fuer Fonts
+ if(pBulletFontNames[i] != SwXNumberingRules::GetInvalidStyle() &&
+ ((pBulletFontNames[i].Len() && !pFmt->GetBulletFont()) ||
+ (pBulletFontNames[i].Len() &&
+ pFmt->GetBulletFont()->GetName() != pBulletFontNames[i]) ))
+ {
+ const SvxFontListItem* pFontListItem =
+ (const SvxFontListItem* )pDoc->GetDocShell()
+ ->GetItem( SID_ATTR_CHAR_FONTLIST );
+ const FontList* pList = pFontListItem->GetFontList();
+ FontInfo aInfo = pList->Get(
+ pBulletFontNames[i],WEIGHT_NORMAL, ITALIC_NONE);
+ Font aFont(aInfo);
+ aFmt.SetBulletFont(&aFont);
+ }
+ aSetRule.Set( i, &aFmt );
+ }
+ }
+ rBase.mxNewBase->SetNumRule(aSetRule);
+ }
+ }
+ else
+ throw lang::IllegalArgumentException();
+ }
+ break;
+ // case FN_UNO_DEFAULT_OUTLINE_LEVEL: //#outline level,removed by zahojianwei
+ //{
+ // sal_Int8 nLevel = 0;
+ // if( rValue >>= nLevel )
+ // rBase.mxNewBase->GetCollection()->SetOutlineLevel( nLevel );
+ // else
+ // rBase.mxNewBase->GetCollection()->SetOutlineLevel( NO_NUMBERING );
+ //}
+ //break;
+ case RES_PARATR_OUTLINELEVEL: //add by zahojianwei
+ {
+ sal_Int16 nLevel = 0;
+ rValue >>= nLevel;
+ if( 0 <= nLevel && nLevel <= MAXLEVEL)
+ rBase.mxNewBase->GetCollection()->SetAttrOutlineLevel( nLevel );
+ }
+ break; //<-end,zhaojianwei
+ case FN_UNO_FOLLOW_STYLE:
+ {
+ OUString sTmp;
+ rValue >>= sTmp;
+ String aString;
+ SwStyleNameMapper::FillUIName(sTmp, aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True ) ;
+ rBase.mxNewBase->SetFollow( aString );
+ }
+ break;
+ case RES_PAGEDESC :
+ if( MID_PAGEDESC_PAGEDESCNAME != rEntry.nMemberId)
+ goto put_itemset;
+ {
+ // Sonderbehandlung RES_PAGEDESC
+ if(rValue.getValueType() != ::getCppuType((const OUString*)0))
+ throw lang::IllegalArgumentException();
+ SfxItemSet& rStyleSet = rBase.GetItemSet();
+
+ SwFmtPageDesc* pNewDesc = 0;
+ const SfxPoolItem* pItem;
+ if(SFX_ITEM_SET == rStyleSet.GetItemState( RES_PAGEDESC, sal_True, &pItem ) )
+ {
+ pNewDesc = new SwFmtPageDesc(*((SwFmtPageDesc*)pItem));
+ }
+ if(!pNewDesc)
+ pNewDesc = new SwFmtPageDesc();
+ OUString uDescName;
+ rValue >>= uDescName;
+ String sDescName;
+ SwStyleNameMapper::FillUIName(uDescName, sDescName, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True );
+ if(!pNewDesc->GetPageDesc() || pNewDesc->GetPageDesc()->GetName() != sDescName)
+ {
+ //sal_uInt16 nCount = pDoc->GetPageDescCnt();
+ sal_Bool bPut = sal_False;
+ if(sDescName.Len())
+ {
+ SwPageDesc* pPageDesc = ::GetPageDescByName_Impl(*pDoc, sDescName);
+ if(pPageDesc)
+ {
+ pPageDesc->Add( pNewDesc );
+ bPut = sal_True;
+ }
+ else
+ {
+ throw lang::IllegalArgumentException();
+ }
+ }
+ if(!bPut)
+ {
+ rStyleSet.ClearItem(RES_BREAK);
+ rStyleSet.Put(SwFmtPageDesc());
+ }
+ else
+ rStyleSet.Put(*pNewDesc);
+ }
+ delete pNewDesc;
+ }
+ break;
+ case FN_UNO_IS_AUTO_UPDATE:
+ {
+ BOOL bAuto = *(sal_Bool*)rValue.getValue();
+ if(SFX_STYLE_FAMILY_PARA == eFamily)
+ rBase.mxNewBase->GetCollection()->SetAutoUpdateFmt(bAuto);
+ else if(SFX_STYLE_FAMILY_FRAME == eFamily)
+ rBase.mxNewBase->GetFrmFmt()->SetAutoUpdateFmt(bAuto);
+ }
+ break;
+ case FN_UNO_PARA_STYLE_CONDITIONS:
+ {
+ uno::Sequence< beans::NamedValue > aSeq;
+ if (!(rValue >>= aSeq))
+ throw lang::IllegalArgumentException();
+
+ DBG_ASSERT(COND_COMMAND_COUNT == 28,
+ "invalid size of comman count?");
+ const beans::NamedValue *pSeq = aSeq.getConstArray();
+ sal_Int32 nLen = aSeq.getLength();
+
+ sal_Bool bFailed = sal_False;
+ SwCondCollItem aCondItem;
+ for(USHORT i = 0; i < nLen; i++)
+ {
+ OUString aTmp;
+ if ((pSeq[i].Value >>= aTmp))
+ {
+ // get UI style name from programmatic style name
+ String aStyleName;
+ SwStyleNameMapper::FillUIName( aTmp, aStyleName, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True );
+
+ //
+ // check for correct context and style name
+ //
+ sal_Int16 nIdx = GetCommandContextIndex( pSeq[i].Name );
+ //
+ pBasePool->SetSearchMask( SFX_STYLE_FAMILY_PARA, SFXSTYLEBIT_ALL );
+ sal_Bool bStyleFound = sal_False;
+ const SfxStyleSheetBase* pBase = pBasePool->First();
+ while (pBase && !bStyleFound)
+ {
+ if(pBase->GetName() == aStyleName)
+ bStyleFound = sal_True;
+ pBase = pBasePool->Next();
+ }
+ //
+ if (nIdx == -1 || !bStyleFound)
+ {
+ bFailed = sal_True;
+ break;
+ }
+
+ aCondItem.SetStyle( &aStyleName, nIdx);
+ }
+ else
+ bFailed = sal_True;
+ }
+ if (bFailed)
+ throw lang::IllegalArgumentException();
+ rBase.GetItemSet().Put( aCondItem );
+ }
+ break;
+ case FN_UNO_CATEGORY:
+ {
+ if(!rBase.mxNewBase->IsUserDefined())
+ throw lang::IllegalArgumentException();
+ short nSet = 0;
+ rValue >>= nSet;
+
+ sal_uInt16 nId;
+ switch( nSet )
+ {
+ case style::ParagraphStyleCategory::TEXT:
+ nId = SWSTYLEBIT_TEXT;
+ break;
+ case style::ParagraphStyleCategory::CHAPTER:
+ nId = SWSTYLEBIT_CHAPTER;
+ break;
+ case style::ParagraphStyleCategory::LIST:
+ nId = SWSTYLEBIT_LIST;
+ break;
+ case style::ParagraphStyleCategory::INDEX:
+ nId = SWSTYLEBIT_IDX;
+ break;
+ case style::ParagraphStyleCategory::EXTRA:
+ nId = SWSTYLEBIT_EXTRA;
+ break;
+ case style::ParagraphStyleCategory::HTML:
+ nId = SWSTYLEBIT_HTML;
+ break;
+ default: throw lang::IllegalArgumentException();
+ }
+ rBase.mxNewBase->SetMask( nId|SFXSTYLEBIT_USERDEF );
+ }
+ break;
+ case SID_SWREGISTER_COLLECTION:
+ {
+ OUString sName;
+ rValue >>= sName;
+ SwRegisterItem aReg( sName.getLength() != 0);
+ aReg.SetWhich(SID_SWREGISTER_MODE);
+ rBase.GetItemSet().Put(aReg);
+ String aString;
+ SwStyleNameMapper::FillUIName(sName, aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, sal_True);
+
+ rBase.GetItemSet().Put(SfxStringItem(SID_SWREGISTER_COLLECTION, aString ) );
+ }
+ break;
+ case RES_TXTATR_CJK_RUBY:
+ if(MID_RUBY_CHARSTYLE == rEntry.nMemberId )
+ {
+ OUString sTmp;
+ if(rValue >>= sTmp)
+ {
+ SfxItemSet& rStyleSet = rBase.GetItemSet();
+ SwFmtRuby* pRuby = 0;
+ const SfxPoolItem* pItem;
+ if(SFX_ITEM_SET == rStyleSet.GetItemState( RES_TXTATR_CJK_RUBY, sal_True, &pItem ) )
+ pRuby = new SwFmtRuby(*((SwFmtRuby*)pItem));
+ if(!pRuby)
+ pRuby = new SwFmtRuby(aEmptyStr);
+ String sStyle;
+ SwStyleNameMapper::FillUIName(sTmp, sStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, sal_True );
+ pRuby->SetCharFmtName( sTmp );
+ pRuby->SetCharFmtId( 0 );
+ if(sTmp.getLength())
+ {
+ sal_uInt16 nId = SwStyleNameMapper::GetPoolIdFromUIName( sTmp, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT );
+ pRuby->SetCharFmtId(nId);
+ }
+ rStyleSet.Put(*pRuby);
+ delete pRuby;
+ }
+ else
+ throw lang::IllegalArgumentException();
+ }
+ goto put_itemset;
+ //break;
+ case RES_PARATR_DROP:
+ {
+ if( MID_DROPCAP_CHAR_STYLE_NAME == rEntry.nMemberId)
+ {
+ if(rValue.getValueType() == ::getCppuType((const OUString*)0))
+ {
+ SfxItemSet& rStyleSet = rBase.GetItemSet();
+
+ SwFmtDrop* pDrop = 0;
+ const SfxPoolItem* pItem;
+ if(SFX_ITEM_SET == rStyleSet.GetItemState( RES_PARATR_DROP, sal_True, &pItem ) )
+ pDrop = new SwFmtDrop(*((SwFmtDrop*)pItem));
+ if(!pDrop)
+ pDrop = new SwFmtDrop();
+ OUString uStyle;
+ rValue >>= uStyle;
+ String sStyle;
+ SwStyleNameMapper::FillUIName(uStyle, sStyle, nsSwGetPoolIdFromName::GET_POOLID_CHRFMT, sal_True );
+ SwDocStyleSheet* pStyle =
+ (SwDocStyleSheet*)pDoc->GetDocShell()->GetStyleSheetPool()->Find(sStyle, SFX_STYLE_FAMILY_CHAR);
+ if(pStyle)
+ pDrop->SetCharFmt(pStyle->GetCharFmt());
+ else
+ throw lang::IllegalArgumentException();
+ rStyleSet.Put(*pDrop);
+ delete pDrop;
+ }
+ else
+ throw lang::IllegalArgumentException();
+ break;
+ }
+ }
+ //no break!
+ default:
+put_itemset:
+ {
+ SfxItemSet& rStyleSet = rBase.GetItemSet();
+ SfxItemSet aSet(*rStyleSet.GetPool(), rEntry.nWID, rEntry.nWID);
+ aSet.SetParent(&rStyleSet);
+ rPropSet.setPropertyValue(rEntry, rValue, aSet);
+ rStyleSet.Put(aSet);
+ // --> OD 2006-10-18 #i70223#
+ if ( SFX_STYLE_FAMILY_PARA == eFamily &&
+ rEntry.nWID == RES_PARATR_NUMRULE &&
+ rBase.mxNewBase.is() && rBase.mxNewBase->GetCollection() &&
+ //rBase.mxNewBase->GetCollection()->GetOutlineLevel() < MAXLEVEL /* assigned to list level of outline style */) //#outline level,removed by zhaojianwei
+ rBase.mxNewBase->GetCollection()->IsAssignedToListLevelOfOutlineStyle() ) ////<-end,add by zhaojianwei
+
+ {
+ OUString sNewNumberingRuleName;
+ rValue >>= sNewNumberingRuleName;
+ String sTmp( sNewNumberingRuleName );
+ if ( sNewNumberingRuleName.getLength() == 0 ||
+ sTmp != pDoc->GetOutlineNumRule()->GetName() )
+ {
+ // delete assignment to list level of outline style.
+ //rBase.mxNewBase->GetCollection()->SetOutlineLevel( NO_NUMBERING ); //#outline level,removed by zhaojianwei
+ rBase.mxNewBase->GetCollection()->DeleteAssignmentToListLevelOfOutlineStyle(); //<-end,adde by zhaojianwei
+ }
+ }
+ }
+ }
+}
+
+void SAL_CALL SwXStyle::SetPropertyValues_Impl(
+ const uno::Sequence< OUString >& rPropertyNames,
+ const uno::Sequence< uno::Any >& rValues )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException)
+{
+ if ( !m_pDoc )
+ throw uno::RuntimeException();
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_STYLE;
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_PARA : nPropSetId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE; break;
+ case SFX_STYLE_FAMILY_FRAME : nPropSetId = PROPERTY_MAP_FRAME_STYLE ;break;
+ case SFX_STYLE_FAMILY_PAGE : nPropSetId = PROPERTY_MAP_PAGE_STYLE ;break;
+ case SFX_STYLE_FAMILY_PSEUDO: nPropSetId = PROPERTY_MAP_NUM_STYLE ;break;
+ default:
+ ;
+ }
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+
+ if(rPropertyNames.getLength() != rValues.getLength())
+ throw lang::IllegalArgumentException();
+
+ const OUString* pNames = rPropertyNames.getConstArray();
+ const uno::Any* pValues = rValues.getConstArray();
+
+ SwStyleBase_Impl aBaseImpl(*m_pDoc, sStyleName);
+ if(pBasePool)
+ {
+ sal_uInt16 nSaveMask = pBasePool->GetSearchMask();
+ pBasePool->SetSearchMask(eFamily);
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ pBasePool->SetSearchMask(eFamily, nSaveMask );
+ DBG_ASSERT(pBase, "where is the style?" );
+ if(pBase)
+ aBaseImpl.mxNewBase = new SwDocStyleSheet(*(SwDocStyleSheet*)pBase);
+ else
+ throw uno::RuntimeException();
+ }
+
+ for(sal_Int16 nProp = 0; nProp < rPropertyNames.getLength(); nProp++)
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( pNames[nProp]);
+
+ if(!pEntry ||
+ (!bIsConditional && pNames[nProp].equalsAsciiL(SW_PROP_NAME(UNO_NAME_PARA_STYLE_CONDITIONS))))
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+ if(aBaseImpl.mxNewBase.is())
+ {
+ lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl,
+ pBasePool, m_pDoc, eFamily);
+ }
+ else if(bIsDescriptor)
+ {
+ if(!pPropImpl->SetProperty(pNames[nProp], pValues[nProp]))
+ throw lang::IllegalArgumentException();
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ if(aBaseImpl.HasItemSet())
+ aBaseImpl.mxNewBase->SetItemSet(aBaseImpl.GetItemSet());
+}
+
+void SwXStyle::setPropertyValues(
+ const uno::Sequence< OUString >& rPropertyNames,
+ const uno::Sequence< uno::Any >& rValues )
+ throw(beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ // workaround for bad designed API
+ try
+ {
+ SetPropertyValues_Impl( rPropertyNames, rValues );
+ }
+ catch (beans::UnknownPropertyException &rException)
+ {
+ // wrap the original (here not allowed) exception in
+ // a lang::WrappedTargetException that gets thrown instead.
+ lang::WrappedTargetException aWExc;
+ aWExc.TargetException <<= rException;
+ throw aWExc;
+ }
+}
+
+uno::Any lcl_GetStyleProperty(const SfxItemPropertySimpleEntry& rEntry,
+ const SfxItemPropertySet& rPropSet,
+ SwStyleBase_Impl& rBase,
+ SfxStyleSheetBase* pBase,
+ SfxStyleFamily eFamily,
+ SwDoc *pDoc) throw(uno::RuntimeException)
+{
+ uno::Any aRet;
+ if(FN_UNO_IS_PHYSICAL == rEntry.nWID)
+ {
+ BOOL bPhys = pBase != 0;
+ if(pBase)
+ {
+ bPhys = ((SwDocStyleSheet*)pBase)->IsPhysical();
+ // The standard character format is not existing physically
+ if( bPhys && SFX_STYLE_FAMILY_CHAR == eFamily &&
+ ((SwDocStyleSheet*)pBase)->GetCharFmt() &&
+ ((SwDocStyleSheet*)pBase)->GetCharFmt()->IsDefault() )
+ bPhys = FALSE;
+ }
+ aRet.setValue(&bPhys, ::getBooleanCppuType());
+ }
+ else if(pBase)
+ {
+ if(!rBase.mxNewBase.is())
+ rBase.mxNewBase = new SwDocStyleSheet( *(SwDocStyleSheet*)pBase );
+ switch(rEntry.nWID)
+ {
+ case RES_PAPER_BIN:
+ {
+ SfxItemSet& rSet = rBase.GetItemSet();
+ rPropSet.getPropertyValue(rEntry, rSet, aRet);
+ sal_Int8 nBin = 0;
+ aRet >>= nBin;
+ if ( nBin == -1 )
+ aRet <<= OUString ( RTL_CONSTASCII_USTRINGPARAM ( "[From printer settings]" ) );
+ else
+ {
+ SfxPrinter *pPrinter = pDoc->getPrinter( false );
+ OUString sTmp;
+ if (pPrinter )
+ sTmp = pPrinter->GetPaperBinName ( nBin );
+ aRet <<= sTmp;
+ }
+ }
+ break;
+ case FN_UNO_NUM_RULES: //Sonderbehandlung fuer das SvxNumRuleItem:
+ {
+ const SwNumRule* pRule = rBase.mxNewBase->GetNumRule();
+ DBG_ASSERT(pRule, "Wo ist die NumRule?");
+ uno::Reference< container::XIndexReplace > xRules = new SwXNumberingRules(*pRule);
+ aRet.setValue(&xRules, ::getCppuType((uno::Reference<container::XIndexReplace>*)0));
+ }
+ break;
+ //case FN_UNO_DEFAULT_OUTLINE_LEVEL: //#outline level,removed by zahojianwei
+ //{
+ // DBG_ASSERT( SFX_STYLE_FAMILY_PARA == eFamily, "only paras" );
+ // BYTE nLevel = rBase.mxNewBase->GetCollection()->GetOutlineLevel();
+ // if( nLevel != NO_NUMBERING )
+ // aRet <<= static_cast<sal_Int8>( nLevel );
+ //}
+ //break;
+ case RES_PARATR_OUTLINELEVEL: //add by zahojianwei
+ {
+ DBG_ASSERT( SFX_STYLE_FAMILY_PARA == eFamily, "only paras" );
+ int nLevel = rBase.mxNewBase->GetCollection()->GetAttrOutlineLevel();
+ aRet <<= static_cast<sal_Int16>( nLevel );
+ }
+ break; //<-end,zhaojianwei
+ case FN_UNO_FOLLOW_STYLE:
+ {
+ String aString;
+ SwStyleNameMapper::FillProgName(rBase.mxNewBase->GetFollow(), aString, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True);
+ aRet <<= OUString( aString );
+ }
+ break;
+ case RES_PAGEDESC :
+ if( MID_PAGEDESC_PAGEDESCNAME != rEntry.nMemberId)
+ goto query_itemset;
+ {
+ // Sonderbehandlung RES_PAGEDESC
+ const SfxPoolItem* pItem;
+ if(SFX_ITEM_SET == rBase.GetItemSet().GetItemState( RES_PAGEDESC, sal_True, &pItem ) )
+ {
+ const SwPageDesc* pDesc = ((const SwFmtPageDesc*)pItem)->GetPageDesc();
+ if(pDesc)
+ {
+ String aString;
+ SwStyleNameMapper::FillProgName(pDesc->GetName(), aString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True );
+ aRet <<= OUString( aString );
+ }
+ }
+ }
+ break;
+ case FN_UNO_IS_AUTO_UPDATE:
+ {
+ BOOL bAuto = FALSE;
+ if(SFX_STYLE_FAMILY_PARA == eFamily)
+ bAuto = rBase.mxNewBase->GetCollection()->IsAutoUpdateFmt();
+ else if(SFX_STYLE_FAMILY_FRAME == eFamily)
+ bAuto = rBase.mxNewBase->GetFrmFmt()->IsAutoUpdateFmt();
+ aRet.setValue(&bAuto, ::getBooleanCppuType());
+ }
+ break;
+ case FN_UNO_DISPLAY_NAME:
+ {
+ OUString sName(rBase.mxNewBase->GetDisplayName());
+ aRet <<= sName;
+ }
+ break;
+ case FN_UNO_PARA_STYLE_CONDITIONS:
+ {
+ DBG_ASSERT(COND_COMMAND_COUNT == 28,
+ "invalid size of comman count?");
+ //SfxItemSet& rStyleSet = rBase.GetItemSet();
+ uno::Sequence< beans::NamedValue > aSeq(COND_COMMAND_COUNT);
+ beans::NamedValue *pSeq = aSeq.getArray();
+
+ SwFmt *pFmt = ((SwDocStyleSheet*)pBase)->GetCollection();
+ const CommandStruct *pCmds = SwCondCollItem::GetCmds();
+ for (USHORT n = 0; n < COND_COMMAND_COUNT; ++n)
+ {
+ String aStyleName;
+
+ const SwCollCondition* pCond = 0;
+ if( pFmt && RES_CONDTXTFMTCOLL == pFmt->Which() &&
+ 0 != ( pCond = ((SwConditionTxtFmtColl*)pFmt)->
+ HasCondition( SwCollCondition( 0, pCmds[n].nCnd, pCmds[n].nSubCond ) ) )
+ && pCond->GetTxtFmtColl() )
+ {
+ // get programmatic style name from UI style name
+ aStyleName = pCond->GetTxtFmtColl()->GetName();
+ SwStyleNameMapper::FillProgName(aStyleName, aStyleName, lcl_GetSwEnumFromSfxEnum ( eFamily ), sal_True);
+ }
+
+ pSeq[n].Name = GetCommandContextByIndex(n);
+ pSeq[n].Value <<= rtl::OUString( aStyleName );
+ }
+ aRet <<= aSeq;
+ }
+ break;
+ case FN_UNO_CATEGORY:
+ {
+ sal_uInt16 nPoolId = rBase.mxNewBase->GetCollection()->GetPoolFmtId();
+ short nRet = -1;
+ switch ( COLL_GET_RANGE_BITS & nPoolId )
+ {
+ case COLL_TEXT_BITS:
+ nRet = style::ParagraphStyleCategory::TEXT;
+ break;
+ case COLL_DOC_BITS:
+ nRet = style::ParagraphStyleCategory::CHAPTER;
+ break;
+ case COLL_LISTS_BITS:
+ nRet = style::ParagraphStyleCategory::LIST;
+ break;
+ case COLL_REGISTER_BITS:
+ nRet = style::ParagraphStyleCategory::INDEX;
+ break;
+ case COLL_EXTRA_BITS:
+ nRet = style::ParagraphStyleCategory::EXTRA;
+ break;
+ case COLL_HTML_BITS:
+ nRet = style::ParagraphStyleCategory::HTML;
+ break;
+ }
+ aRet <<= nRet;
+ }
+ break;
+ case SID_SWREGISTER_COLLECTION:
+ {
+ const SwPageDesc *pPageDesc = rBase.mxNewBase->GetPageDesc();
+ const SwTxtFmtColl* pCol = 0;
+ String aString;
+ if( pPageDesc )
+ pCol = pPageDesc->GetRegisterFmtColl();
+ if( pCol )
+ SwStyleNameMapper::FillProgName(
+ pCol->GetName(), aString, nsSwGetPoolIdFromName::GET_POOLID_TXTCOLL, sal_True );
+ aRet <<= OUString ( aString );
+ }
+ break;
+ default:
+query_itemset:
+ {
+ SfxItemSet& rSet = rBase.GetItemSet();
+ rPropSet.getPropertyValue(rEntry, rSet, aRet);
+ }
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+
+uno::Sequence< uno::Any > SAL_CALL SwXStyle::GetPropertyValues_Impl(
+ const uno::Sequence< OUString > & rPropertyNames )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ if ( !m_pDoc )
+ throw uno::RuntimeException();
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_STYLE;
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_PARA : nPropSetId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE; break;
+ case SFX_STYLE_FAMILY_FRAME : nPropSetId = PROPERTY_MAP_FRAME_STYLE ;break;
+ case SFX_STYLE_FAMILY_PAGE : nPropSetId = PROPERTY_MAP_PAGE_STYLE ;break;
+ case SFX_STYLE_FAMILY_PSEUDO: nPropSetId = PROPERTY_MAP_NUM_STYLE ;break;
+ default:
+ ;
+ }
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+
+ const OUString* pNames = rPropertyNames.getConstArray();
+ uno::Sequence< uno::Any > aRet(rPropertyNames.getLength());
+ uno::Any* pRet = aRet.getArray();
+ SwStyleBase_Impl aBase(*m_pDoc, sStyleName);
+ SfxStyleSheetBase* pBase = 0;
+ for(sal_Int32 nProp = 0; nProp < rPropertyNames.getLength(); nProp++)
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( pNames[nProp]);
+ if(!pEntry ||
+ (!bIsConditional && pNames[nProp].equalsAsciiL(SW_PROP_NAME(UNO_NAME_PARA_STYLE_CONDITIONS))))
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+ if(pBasePool)
+ {
+ if(!pBase)
+ {
+ sal_uInt16 nSaveMask = pBasePool->GetSearchMask();
+ pBasePool->SetSearchMask(eFamily, SFXSTYLEBIT_ALL );
+ pBase = pBasePool->Find(sStyleName);
+ pBasePool->SetSearchMask(eFamily, nSaveMask );
+ }
+ pRet[nProp] = lcl_GetStyleProperty(*pEntry, *pPropSet, aBase, pBase, eFamily, GetDoc() );
+ }
+ else if(bIsDescriptor)
+ {
+ uno::Any *pAny = 0;
+ pPropImpl->GetProperty ( pNames[nProp], pAny );
+ if( !pAny )
+ {
+ sal_Bool bExcept = sal_False;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_PSEUDO:
+ bExcept = sal_True;
+ break;
+ case SFX_STYLE_FAMILY_PARA:
+ case SFX_STYLE_FAMILY_PAGE:
+ pPropImpl->GetProperty ( pNames[nProp], mxStyleData, pRet[ nProp ] );
+ break;
+ case SFX_STYLE_FAMILY_CHAR:
+ case SFX_STYLE_FAMILY_FRAME :
+ {
+ if (pEntry->nWID >= POOLATTR_BEGIN && pEntry->nWID < RES_UNKNOWNATR_END )
+ {
+ SwFmt * pFmt;
+ if ( eFamily == SFX_STYLE_FAMILY_CHAR )
+ pFmt = m_pDoc->GetDfltCharFmt();
+ else
+ pFmt = m_pDoc->GetDfltFrmFmt();
+ const SwAttrPool * pPool = pFmt->GetAttrSet().GetPool();
+ const SfxPoolItem & rItem = pPool->GetDefaultItem ( pEntry->nWID );
+ rItem.QueryValue ( pRet[nProp], pEntry->nMemberId );
+ }
+ else
+ bExcept = sal_True;
+ }
+ break;
+
+ default:
+ ;
+ }
+ if (bExcept )
+ {
+ uno::RuntimeException aExcept;
+ aExcept.Message = OUString ( RTL_CONSTASCII_USTRINGPARAM ( "No default value for: " ) ) + pNames[nProp];
+ throw aExcept;
+ }
+ }
+ else
+ pRet [ nProp ] = *pAny;
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ return aRet;
+}
+
+uno::Sequence< uno::Any > SwXStyle::getPropertyValues(
+ const uno::Sequence< OUString >& rPropertyNames ) throw(uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ uno::Sequence< uno::Any > aValues;
+
+ // workaround for bad designed API
+ try
+ {
+ aValues = GetPropertyValues_Impl( rPropertyNames );
+ }
+ catch (beans::UnknownPropertyException &)
+ {
+ throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property exception caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ catch (lang::WrappedTargetException &)
+ {
+ throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "WrappedTargetException caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ }
+
+ return aValues;
+}
+
+void SwXStyle::addPropertiesChangeListener(
+ const uno::Sequence< OUString >& /*aPropertyNames*/,
+ const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
+ throw(uno::RuntimeException)
+{
+}
+
+void SwXStyle::removePropertiesChangeListener(
+ const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
+ throw(uno::RuntimeException)
+{
+}
+
+void SwXStyle::firePropertiesChangeEvent(
+ const uno::Sequence< OUString >& /*aPropertyNames*/,
+ const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
+ throw(uno::RuntimeException)
+{
+}
+
+void SwXStyle::setPropertyValue(const OUString& rPropertyName, const uno::Any& rValue)
+ throw( beans::UnknownPropertyException,
+ beans::PropertyVetoException,
+ lang::IllegalArgumentException,
+ lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ const uno::Sequence<OUString> aProperties(&rPropertyName, 1);
+ const uno::Sequence<uno::Any> aValues(&rValue, 1);
+ SetPropertyValues_Impl( aProperties, aValues );
+}
+
+uno::Any SwXStyle::getPropertyValue(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ const uno::Sequence<OUString> aProperties(&rPropertyName, 1);
+ return GetPropertyValues_Impl(aProperties).getConstArray()[0];
+
+}
+
+void SwXStyle::addPropertyChangeListener(const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXStyle::removePropertyChangeListener(const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener > & /*xListener*/)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXStyle::addVetoableChangeListener(const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+void SwXStyle::removeVetoableChangeListener(const OUString& /*rPropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener > & /*xListener*/)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ DBG_WARNING("not implemented");
+}
+
+beans::PropertyState SwXStyle::getPropertyState(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+
+ uno::Sequence< OUString > aNames(1);
+ OUString* pNames = aNames.getArray();
+ pNames[0] = rPropertyName;
+ uno::Sequence< beans::PropertyState > aStates = getPropertyStates(aNames);
+ return aStates.getConstArray()[0];
+}
+
+uno::Sequence< beans::PropertyState > SwXStyle::getPropertyStates(
+ const uno::Sequence< OUString >& rPropertyNames)
+ throw( beans::UnknownPropertyException, uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Sequence< beans::PropertyState > aRet(rPropertyNames.getLength());
+ beans::PropertyState* pStates = aRet.getArray();
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily );
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "where is the style?" );
+
+ if(pBase)
+ {
+ const OUString* pNames = rPropertyNames.getConstArray();
+ rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_STYLE;
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_PARA : nPropSetId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE; break;
+ case SFX_STYLE_FAMILY_FRAME : nPropSetId = PROPERTY_MAP_FRAME_STYLE ;break;
+ case SFX_STYLE_FAMILY_PAGE : nPropSetId = PROPERTY_MAP_PAGE_STYLE; break;
+ case SFX_STYLE_FAMILY_PSEUDO: nPropSetId = PROPERTY_MAP_NUM_STYLE ;break;
+ default:
+ ;
+ }
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+
+ SfxItemSet aSet = xStyle->GetItemSet();
+ for(sal_Int32 i = 0; i < rPropertyNames.getLength(); i++)
+ {
+ const String& rPropName = pNames[i];
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( rPropName);
+ if(!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropName, static_cast < cppu::OWeakObject * > ( this ) );
+ if( FN_UNO_NUM_RULES == pEntry->nWID ||
+ FN_UNO_FOLLOW_STYLE == pEntry->nWID )
+ {
+ pStates[i] = beans::PropertyState_DIRECT_VALUE;
+ }
+ // else if( FN_UNO_DEFAULT_OUTLINE_LEVEL == pEntry->nWID ) //#outline level,removed by zahojianwei
+ // {
+ // pStates[i] =
+ // ( xStyle->GetCollection()->GetOutlineLevel()
+ // == NO_NUMBERING )
+ // ? beans::PropertyState_DEFAULT_VALUE
+ // : beans::PropertyState_DIRECT_VALUE;
+ // } //<-end,zhaojianwei
+ else if(SFX_STYLE_FAMILY_PAGE == eFamily &&
+ (rPropName.EqualsAscii("Header", 0, 6)
+ || rPropName.EqualsAscii("Footer", 0, 6)))
+ {
+ sal_uInt16 nResId = lcl_ConvertFNToRES(pEntry->nWID);
+ BOOL bFooter = rPropName.EqualsAscii("Footer", 0, 6);
+ const SvxSetItem* pSetItem;
+ if(SFX_ITEM_SET == aSet.GetItemState(
+ bFooter ? SID_ATTR_PAGE_FOOTERSET : SID_ATTR_PAGE_HEADERSET,
+ sal_False, (const SfxPoolItem**)&pSetItem))
+ {
+ const SfxItemSet& rSet = pSetItem->GetItemSet();
+ SfxItemState eState = rSet.GetItemState(nResId, sal_False);
+ if(SFX_ITEM_SET == eState)
+ pStates[i] = beans::PropertyState_DIRECT_VALUE;
+ else
+ pStates[i] = beans::PropertyState_DEFAULT_VALUE;
+ }
+ else
+ pStates[i] = beans::PropertyState_AMBIGUOUS_VALUE;
+ }
+ else
+ {
+ pStates[i] = pPropSet->getPropertyState(*pEntry, aSet);
+ if( SFX_STYLE_FAMILY_PAGE == eFamily &&
+ SID_ATTR_PAGE_SIZE == pEntry->nWID &&
+ beans::PropertyState_DIRECT_VALUE == pStates[i] )
+ {
+ const SvxSizeItem& rSize =
+ static_cast < const SvxSizeItem& >(
+ aSet.Get(SID_ATTR_PAGE_SIZE) );
+ sal_uInt8 nMemberId = pEntry->nMemberId & 0x7f;
+ if( ( LONG_MAX == rSize.GetSize().Width() &&
+ (MID_SIZE_WIDTH == nMemberId ||
+ MID_SIZE_SIZE == nMemberId ) ) ||
+ ( LONG_MAX == rSize.GetSize().Height() &&
+ MID_SIZE_HEIGHT == nMemberId ) )
+ {
+ pStates[i] = beans::PropertyState_DEFAULT_VALUE;
+ }
+ }
+ }
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+
+void SwXStyle::setPropertyToDefault(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, uno::RuntimeException )
+{
+ const uno::Sequence < OUString > aSequence ( &rPropertyName, 1 );
+ setPropertiesToDefault ( aSequence );
+}
+
+void SAL_CALL SwXStyle::setPropertiesToDefault( const uno::Sequence< OUString >& aPropertyNames )
+ throw (beans::UnknownPropertyException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ SwFmt *pTargetFmt = 0;
+
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily);
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "Where is the style?");
+
+ if(pBase)
+ {
+ rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_CHAR: pTargetFmt = xStyle->GetCharFmt(); break;
+ case SFX_STYLE_FAMILY_PARA: pTargetFmt = xStyle->GetCollection(); break;
+ case SFX_STYLE_FAMILY_FRAME: pTargetFmt = xStyle->GetFrmFmt(); break;
+ case SFX_STYLE_FAMILY_PAGE:
+ {
+ sal_uInt16 nPgDscPos = USHRT_MAX;
+ SwPageDesc *pDesc = m_pDoc->FindPageDescByName( xStyle->GetPageDesc()->GetName(), &nPgDscPos );
+ if( pDesc )
+ pTargetFmt = &pDesc->GetMaster();
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ break;
+ default:
+ ;
+ }
+ }
+ }
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_STYLE;
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_PARA : nPropSetId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE; break;
+ case SFX_STYLE_FAMILY_FRAME : nPropSetId = PROPERTY_MAP_FRAME_STYLE; break;
+ case SFX_STYLE_FAMILY_PAGE : nPropSetId = PROPERTY_MAP_PAGE_STYLE; break;
+ case SFX_STYLE_FAMILY_PSEUDO: nPropSetId = PROPERTY_MAP_NUM_STYLE; break;
+ default:
+ ;
+ }
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+
+ const OUString* pNames = aPropertyNames.getConstArray();
+
+ if ( pTargetFmt )
+ {
+ for( sal_Int32 nProp = 0, nEnd = aPropertyNames.getLength(); nProp < nEnd; nProp++ )
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( pNames[nProp] );
+ if( !pEntry )
+ throw beans::UnknownPropertyException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is unknown: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+ if ( pEntry->nWID == FN_UNO_FOLLOW_STYLE || pEntry->nWID == FN_UNO_NUM_RULES )
+ throw uno::RuntimeException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Cannot reset: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY )
+ throw uno::RuntimeException( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "setPropertiesToDefault: property is read-only: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+
+ //if( pEntry->nWID == FN_UNO_DEFAULT_OUTLINE_LEVEL ) //#outline level, removed by zhaojianwei
+ // static_cast<SwTxtFmtColl*>(pTargetFmt)->SetOutlineLevel( NO_NUMBERING );
+ //else
+ // pTargetFmt->ResetFmtAttr( pEntry->nWID );
+ if( pEntry->nWID == RES_PARATR_OUTLINELEVEL ) //add by zhaojianwei
+ static_cast<SwTxtFmtColl*>(pTargetFmt)->DeleteAssignmentToListLevelOfOutlineStyle();
+ else
+ pTargetFmt->ResetFmtAttr( pEntry->nWID ); //<-end,zhaojianwei
+ }
+ }
+ else if ( bIsDescriptor )
+ {
+ for( sal_Int32 nProp = 0, nEnd = aPropertyNames.getLength(); nProp < nEnd; nProp++ )
+ pPropImpl->ClearProperty ( pNames[ nProp ] );
+ }
+}
+
+void SAL_CALL SwXStyle::setAllPropertiesToDefault( )
+ throw (uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ if(pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily);
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "where is the style, you fiend!?");
+
+ if(pBase)
+ {
+ rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+
+ SwFmt *pTargetFmt = 0;
+ sal_uInt16 nPgDscPos = USHRT_MAX;
+ switch( eFamily )
+ {
+ case SFX_STYLE_FAMILY_CHAR :
+ pTargetFmt = xStyle->GetCharFmt();
+ break;
+ case SFX_STYLE_FAMILY_PARA :
+ {
+ pTargetFmt = xStyle->GetCollection();
+ // --> OD 2007-07-25 #132402# - make code robust
+ if ( xStyle->GetCollection() )
+ {
+ // xStyle->GetCollection()->SetOutlineLevel( NO_NUMBERING ); //#outline level,removed by zhaojianwei
+ xStyle->GetCollection()->DeleteAssignmentToListLevelOfOutlineStyle(); //<-end,add by zhaojianwei
+ }
+ // <--
+ }
+ break;
+ case SFX_STYLE_FAMILY_FRAME:
+ pTargetFmt = xStyle->GetFrmFmt();
+ break;
+ case SFX_STYLE_FAMILY_PAGE:
+ {
+ SwPageDesc *pDesc = m_pDoc->FindPageDescByName( xStyle->GetPageDesc()->GetName(), &nPgDscPos );
+ if( pDesc )
+ {
+ pTargetFmt = &pDesc->GetMaster();
+ pDesc->SetUseOn ( nsUseOnPage::PD_ALL );
+ }
+ }
+ break;
+ case SFX_STYLE_FAMILY_PSEUDO:
+ break;
+
+ default:
+ ;
+ }
+ if( pTargetFmt )
+ {
+ if( USHRT_MAX != nPgDscPos )
+ {
+ SwPageDesc& rPageDesc = m_pDoc->_GetPageDesc(nPgDscPos);
+ rPageDesc.ResetAllMasterAttr();
+
+ SvxLRSpaceItem aLR(RES_LR_SPACE);
+ sal_Int32 nSize = GetMetricVal ( CM_1) * 2;
+ aLR.SetLeft ( nSize );
+ aLR.SetLeft ( nSize );
+ SvxULSpaceItem aUL( RES_UL_SPACE );
+ aUL.SetUpper ( static_cast < sal_uInt16 > ( nSize ) );
+ aUL.SetLower ( static_cast < sal_uInt16 > ( nSize ) );
+ pTargetFmt->SetFmtAttr( aLR );
+ pTargetFmt->SetFmtAttr( aUL );
+
+ SwPageDesc* pStdPgDsc = m_pDoc->GetPageDescFromPool( RES_POOLPAGE_STANDARD );
+ SwFmtFrmSize aFrmSz( ATT_FIX_SIZE );
+ if( RES_POOLPAGE_STANDARD == rPageDesc.GetPoolFmtId() )
+ {
+ if( m_pDoc->getPrinter( false ) )
+ {
+ const Size aPhysSize( SvxPaperInfo::GetPaperSize(
+ static_cast<Printer*>( m_pDoc->getPrinter( false ) )) );
+ aFrmSz.SetSize( aPhysSize );
+ }
+ else
+ {
+ // --> OD 2008-07-25 #i91928#
+// aFrmSz.SetWidth( LONG_MAX );
+// aFrmSz.SetHeight( LONG_MAX );
+ aFrmSz.SetSize( SvxPaperInfo::GetDefaultPaperSize() );
+ // <--
+ }
+
+ }
+ else
+ {
+ aFrmSz = pStdPgDsc->GetMaster().GetFrmSize();
+ }
+ if( pStdPgDsc->GetLandscape() )
+ {
+ SwTwips nTmp = aFrmSz.GetHeight();
+ aFrmSz.SetHeight( aFrmSz.GetWidth() );
+ aFrmSz.SetWidth( nTmp );
+ }
+ pTargetFmt->SetFmtAttr( aFrmSz );
+ }
+ else
+ {
+ // --> OD 2007-01-25 #i73790# - method renamed
+ pTargetFmt->ResetAllFmtAttr();
+ // <--
+ }
+
+ if( USHRT_MAX != nPgDscPos )
+ m_pDoc->ChgPageDesc( nPgDscPos,
+ const_cast<const SwDoc *>(m_pDoc)
+ ->GetPageDesc(nPgDscPos) );
+ }
+
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ else if ( bIsDescriptor )
+ pPropImpl->ClearAllProperties();
+ else
+ throw uno::RuntimeException();
+}
+
+uno::Sequence< uno::Any > SAL_CALL SwXStyle::getPropertyDefaults( const uno::Sequence< OUString >& aPropertyNames )
+ throw (beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ sal_Int32 nCount = aPropertyNames.getLength();
+ uno::Sequence < uno::Any > aRet ( nCount );
+ if ( nCount )
+ {
+ if( pBasePool)
+ {
+ pBasePool->SetSearchMask(eFamily);
+ SfxStyleSheetBase* pBase = pBasePool->Find(sStyleName);
+ DBG_ASSERT(pBase, "Doesn't seem to be a style!");
+
+ if(pBase)
+ {
+ rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_STYLE;
+ switch(eFamily)
+ {
+ case SFX_STYLE_FAMILY_PARA : nPropSetId = bIsConditional ? PROPERTY_MAP_CONDITIONAL_PARA_STYLE : PROPERTY_MAP_PARA_STYLE; break;
+ case SFX_STYLE_FAMILY_FRAME : nPropSetId = PROPERTY_MAP_FRAME_STYLE; break;
+ case SFX_STYLE_FAMILY_PAGE : nPropSetId = PROPERTY_MAP_PAGE_STYLE; break;
+ case SFX_STYLE_FAMILY_PSEUDO: nPropSetId = PROPERTY_MAP_NUM_STYLE; break;
+ default:
+ ;
+ }
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap* pMap = pPropSet->getPropertyMap();
+
+ const SfxItemSet &rSet = xStyle->GetItemSet(), *pParentSet = rSet.GetParent();
+ const OUString *pNames = aPropertyNames.getConstArray();
+ uno::Any *pRet = aRet.getArray();
+ for ( sal_Int32 i = 0 ; i < nCount; i++)
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( pNames[i] );
+ if ( !pEntry )
+ throw beans::UnknownPropertyException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pNames[i], static_cast < cppu::OWeakObject * > ( this ) );
+
+ if( pParentSet )
+ aSwMapProvider.GetPropertySet(nPropSetId)->getPropertyValue(pNames[i], *pParentSet, pRet[i]);
+ else if( pEntry->nWID != rSet.GetPool()->GetSlotId(pEntry->nWID) )
+ {
+ const SfxPoolItem& rItem = rSet.GetPool()->GetDefaultItem(pEntry->nWID);
+ rItem.QueryValue(pRet[i], pEntry->nMemberId);
+ }
+ }
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ return aRet;
+}
+
+uno::Any SwXStyle::getPropertyDefault(const OUString& rPropertyName)
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ const uno::Sequence < OUString > aSequence ( &rPropertyName, 1 );
+ return getPropertyDefaults ( aSequence ).getConstArray()[0];
+}
+
+void SwXStyle::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
+{
+ SfxSimpleHint *pHint = PTR_CAST( SfxSimpleHint, &rHint );
+ if( pHint )
+ {
+ if(( pHint->GetId() & SFX_HINT_DYING ) || ( pHint->GetId() & SFX_STYLESHEET_ERASED))
+ {
+ pBasePool = 0;
+ EndListening(rBC);
+ }
+ else if( pHint->GetId() &(SFX_STYLESHEET_CHANGED|SFX_STYLESHEET_ERASED) )
+ {
+ ((SfxStyleSheetBasePool&)rBC).SetSearchMask(eFamily);
+ SfxStyleSheetBase* pOwnBase = ((SfxStyleSheetBasePool&)rBC).Find(sStyleName);
+ if(!pOwnBase)
+ {
+ EndListening(rBC);
+ Invalidate();
+ }
+ }
+ }
+}
+
+void SwXStyle::Invalidate()
+{
+ sStyleName.Erase();
+ pBasePool = 0;
+ m_pDoc = 0;
+ mxStyleData.clear();
+ mxStyleFamily.clear();
+}
+
+/******************************************************************
+ * SwXPageStyle
+ ******************************************************************/
+SwXPageStyle::SwXPageStyle(SfxStyleSheetBasePool& rPool,
+ SwDocShell* pDocSh, SfxStyleFamily eFam,
+ const String& rStyleName)://, const SfxItemPropertyMap* _pMap) :
+ SwXStyle(rPool, eFam, pDocSh->GetDoc(), rStyleName),//, _pMap),
+ pDocShell(pDocSh)
+{
+
+}
+
+SwXPageStyle::SwXPageStyle(SwDocShell* pDocSh) :
+ SwXStyle(pDocSh->GetDoc(), SFX_STYLE_FAMILY_PAGE),
+ pDocShell(pDocSh)
+{
+}
+
+SwXPageStyle::~SwXPageStyle()
+{
+
+}
+
+void SAL_CALL SwXPageStyle::SetPropertyValues_Impl(
+ const uno::Sequence< OUString >& rPropertyNames,
+ const uno::Sequence< uno::Any >& rValues )
+ throw( beans::UnknownPropertyException, beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException)
+{
+ if(!GetDoc())
+ throw uno::RuntimeException();
+
+ if(rPropertyNames.getLength() != rValues.getLength())
+ throw lang::IllegalArgumentException();
+
+ const OUString* pNames = rPropertyNames.getConstArray();
+ const uno::Any* pValues = rValues.getConstArray();
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PAGE_STYLE);
+ const SfxItemPropertyMap* pMap = pPropSet->getPropertyMap();
+ SwStyleBase_Impl aBaseImpl(*GetDoc(), GetStyleName());
+ if(GetBasePool())
+ {
+ sal_uInt16 nSaveMask = GetBasePool()->GetSearchMask();
+ GetBasePool()->SetSearchMask(GetFamily());
+ SfxStyleSheetBase* pBase = GetBasePool()->Find(GetStyleName());
+ GetBasePool()->SetSearchMask(GetFamily(), nSaveMask );
+ DBG_ASSERT(pBase, "where is the style?" );
+ if(pBase)
+ aBaseImpl.mxNewBase = new SwDocStyleSheet(*(SwDocStyleSheet*)pBase);
+ else
+ throw uno::RuntimeException();
+ }
+
+ for(sal_Int16 nProp = 0; nProp < rPropertyNames.getLength(); nProp++)
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( pNames[nProp] );
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+ if ( pEntry->nFlags & beans::PropertyAttribute::READONLY)
+ throw beans::PropertyVetoException ( OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Property is read-only: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+
+ if(GetBasePool())
+ {
+ switch(pEntry->nWID)
+ {
+ case FN_UNO_HEADER_ON:
+ case FN_UNO_HEADER_BACKGROUND:
+ case FN_UNO_HEADER_BOX:
+ case FN_UNO_HEADER_LR_SPACE:
+ case FN_UNO_HEADER_SHADOW:
+ case FN_UNO_HEADER_BODY_DISTANCE:
+ case FN_UNO_HEADER_IS_DYNAMIC_DISTANCE:
+ case FN_UNO_HEADER_SHARE_CONTENT:
+ case FN_UNO_HEADER_HEIGHT:
+ case FN_UNO_HEADER_EAT_SPACING:
+
+ case FN_UNO_FOOTER_ON:
+ case FN_UNO_FOOTER_BACKGROUND:
+ case FN_UNO_FOOTER_BOX:
+ case FN_UNO_FOOTER_LR_SPACE:
+ case FN_UNO_FOOTER_SHADOW:
+ case FN_UNO_FOOTER_BODY_DISTANCE:
+ case FN_UNO_FOOTER_IS_DYNAMIC_DISTANCE:
+ case FN_UNO_FOOTER_SHARE_CONTENT:
+ case FN_UNO_FOOTER_HEIGHT:
+ case FN_UNO_FOOTER_EAT_SPACING:
+ {
+ sal_Bool bSetItem = sal_False;
+ sal_Bool bFooter = sal_False;
+ sal_uInt16 nItemType = TYPE_BOOL;
+ sal_uInt16 nRes = 0;
+ switch(pEntry->nWID)
+ {
+ case FN_UNO_FOOTER_ON: bFooter = sal_True;
+ //kein break;
+ case FN_UNO_HEADER_ON: nRes = SID_ATTR_PAGE_ON;
+ break;
+ case FN_UNO_FOOTER_BACKGROUND: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_BACKGROUND: nRes = RES_BACKGROUND; nItemType = TYPE_BRUSH;
+ break;
+ case FN_UNO_FOOTER_BOX: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_BOX: nRes = RES_BOX; nItemType = TYPE_BOX;
+ break;
+ case FN_UNO_FOOTER_LR_SPACE: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_LR_SPACE: nRes = RES_LR_SPACE;nItemType = TYPE_LRSPACE;
+ break;
+ case FN_UNO_FOOTER_SHADOW: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_SHADOW: nRes = RES_SHADOW;nItemType = TYPE_SHADOW;
+ break;
+ case FN_UNO_FOOTER_BODY_DISTANCE: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_BODY_DISTANCE: nRes = RES_UL_SPACE;nItemType = TYPE_ULSPACE;
+ break;
+ case FN_UNO_FOOTER_IS_DYNAMIC_DISTANCE: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_IS_DYNAMIC_DISTANCE: nRes = SID_ATTR_PAGE_DYNAMIC;
+ break;
+ case FN_UNO_FOOTER_SHARE_CONTENT: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_SHARE_CONTENT: nRes = SID_ATTR_PAGE_SHARED;
+ break;
+ case FN_UNO_FOOTER_HEIGHT: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_HEIGHT: nRes = SID_ATTR_PAGE_SIZE;nItemType = TYPE_SIZE;
+ break;
+ case FN_UNO_FOOTER_EAT_SPACING: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_EAT_SPACING: nRes = RES_HEADER_FOOTER_EAT_SPACING;nItemType = TYPE_SIZE;
+ break;
+ }
+ const SvxSetItem* pSetItem;
+ if(SFX_ITEM_SET == aBaseImpl.GetItemSet().GetItemState(
+ bFooter ? SID_ATTR_PAGE_FOOTERSET : SID_ATTR_PAGE_HEADERSET,
+ sal_False, (const SfxPoolItem**)&pSetItem))
+ {
+ SvxSetItem* pNewSetItem = (SvxSetItem*)pSetItem->Clone();
+ SfxItemSet& rSetSet = pNewSetItem->GetItemSet();
+ const SfxPoolItem* pItem = 0;
+ SfxPoolItem* pNewItem = 0;
+ rSetSet.GetItemState(nRes, sal_True, &pItem);
+ if(!pItem && nRes != rSetSet.GetPool()->GetSlotId(nRes))
+ pItem = &rSetSet.GetPool()->GetDefaultItem(nRes);
+ if(pItem)
+ {
+ pNewItem = pItem->Clone();
+ }
+ else
+ {
+ switch(nItemType)
+ {
+ case TYPE_BOOL: pNewItem = new SfxBoolItem(nRes); break;
+ case TYPE_SIZE: pNewItem = new SvxSizeItem(nRes); break;
+ case TYPE_BRUSH: pNewItem = new SvxBrushItem(nRes); break;
+ case TYPE_ULSPACE: pNewItem = new SvxULSpaceItem(nRes); break;
+ case TYPE_SHADOW : pNewItem = new SvxShadowItem(nRes); break;
+ case TYPE_LRSPACE: pNewItem = new SvxLRSpaceItem(nRes); break;
+ case TYPE_BOX: pNewItem = new SvxBoxItem(nRes); break;
+ }
+ }
+ bSetItem = pNewItem->PutValue(pValues[nProp], pEntry->nMemberId);
+ rSetSet.Put(*pNewItem);
+ aBaseImpl.GetItemSet().Put(*pNewSetItem);
+ delete pNewItem;
+ delete pNewSetItem;
+ }
+ else if(SID_ATTR_PAGE_ON == nRes )
+ {
+ sal_Bool bVal = *(sal_Bool*)pValues[nProp].getValue();
+ if(bVal)
+ {
+ SfxItemSet aTempSet(*aBaseImpl.GetItemSet().GetPool(),
+ RES_BACKGROUND, RES_SHADOW,
+ RES_LR_SPACE, RES_UL_SPACE,
+ nRes, nRes,
+ SID_ATTR_PAGE_SIZE, SID_ATTR_PAGE_SIZE,
+ SID_ATTR_PAGE_DYNAMIC, SID_ATTR_PAGE_DYNAMIC,
+ SID_ATTR_PAGE_SHARED, SID_ATTR_PAGE_SHARED,
+ 0 );
+ aTempSet.Put(SfxBoolItem(nRes, sal_True));
+ aTempSet.Put(SvxSizeItem(SID_ATTR_PAGE_SIZE, Size(MM50, MM50)));
+ aTempSet.Put(SvxLRSpaceItem(RES_LR_SPACE));
+ aTempSet.Put(SvxULSpaceItem(RES_UL_SPACE));
+ aTempSet.Put(SfxBoolItem(SID_ATTR_PAGE_SHARED, sal_True));
+ aTempSet.Put(SfxBoolItem(SID_ATTR_PAGE_DYNAMIC, sal_True));
+
+ SvxSetItem aNewSetItem( bFooter ? SID_ATTR_PAGE_FOOTERSET : SID_ATTR_PAGE_HEADERSET,
+ aTempSet);
+ aBaseImpl.GetItemSet().Put(aNewSetItem);
+ }
+ }
+ }
+ break;
+ case FN_PARAM_FTN_INFO :
+ {
+ const SfxPoolItem& rItem = aBaseImpl.GetItemSet().Get(FN_PARAM_FTN_INFO);
+ SfxPoolItem* pNewFtnItem = rItem.Clone();
+ sal_Bool bPut = pNewFtnItem->PutValue(pValues[nProp], pEntry->nMemberId);
+ aBaseImpl.GetItemSet().Put(*pNewFtnItem);
+ delete pNewFtnItem;
+ if(!bPut)
+ throw lang::IllegalArgumentException();
+ }
+ break;
+ case FN_UNO_HEADER :
+ case FN_UNO_HEADER_LEFT :
+ case FN_UNO_HEADER_RIGHT :
+ case FN_UNO_FOOTER :
+ case FN_UNO_FOOTER_LEFT :
+ case FN_UNO_FOOTER_RIGHT :
+ throw lang::IllegalArgumentException();
+ //break;
+ default:
+ lcl_SetStyleProperty(*pEntry, *pPropSet, pValues[nProp], aBaseImpl,
+ GetBasePool(), GetDoc(), GetFamily());
+ }
+ }
+ else if(IsDescriptor())
+ {
+ if(!GetPropImpl()->SetProperty(pNames[nProp], pValues[nProp]))
+ throw lang::IllegalArgumentException();
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ if(aBaseImpl.HasItemSet())
+ {
+ BOOL bDoesUndo = GetDoc()->DoesUndo();
+ if( bDoesUndo )
+ {
+ // Fix i64460: as long as Undo of page styles with header/footer causes trouble...
+ GetDoc()->DelAllUndoObj();
+ GetDoc()->DoUndo( FALSE );
+ }
+ aBaseImpl.mxNewBase->SetItemSet(aBaseImpl.GetItemSet());
+ GetDoc()->DoUndo( bDoesUndo );
+ }
+}
+
+void SwXPageStyle::setPropertyValues(
+ const uno::Sequence< OUString >& rPropertyNames,
+ const uno::Sequence< uno::Any >& rValues )
+ throw(beans::PropertyVetoException, lang::IllegalArgumentException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ // workaround for bad designed API
+ try
+ {
+ SetPropertyValues_Impl( rPropertyNames, rValues );
+ }
+ catch (beans::UnknownPropertyException &rException)
+ {
+ // wrap the original (here not allowed) exception in
+ // a lang::WrappedTargetException that gets thrown instead.
+ lang::WrappedTargetException aWExc;
+ aWExc.TargetException <<= rException;
+ throw aWExc;
+ }
+}
+
+static uno::Reference<text::XText>
+lcl_makeHeaderFooter(
+ const sal_uInt16 nRes, const bool bHeader, SwFrmFmt const*const pFrmFmt)
+{
+ if (!pFrmFmt) { return 0; }
+
+ const SfxItemSet& rSet = pFrmFmt->GetAttrSet();
+ const SfxPoolItem* pItem;
+ if (SFX_ITEM_SET == rSet.GetItemState(nRes, sal_True, &pItem))
+ {
+ SwFrmFmt *const pHeadFootFmt = (bHeader)
+ ? static_cast<SwFmtHeader*>(const_cast<SfxPoolItem*>(pItem))->
+ GetHeaderFmt()
+ : static_cast<SwFmtFooter*>(const_cast<SfxPoolItem*>(pItem))->
+ GetFooterFmt();
+ if (pHeadFootFmt)
+ {
+ return SwXHeadFootText::CreateXHeadFootText(*pHeadFootFmt, bHeader);
+ }
+ }
+ return 0;
+}
+
+uno::Sequence< uno::Any > SAL_CALL SwXPageStyle::GetPropertyValues_Impl(
+ const uno::Sequence< OUString >& rPropertyNames )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ if(!GetDoc())
+ throw uno::RuntimeException();
+
+ sal_Int32 nLength = rPropertyNames.getLength();
+ const OUString* pNames = rPropertyNames.getConstArray();
+ uno::Sequence< uno::Any > aRet ( nLength );
+
+ uno::Any* pRet = aRet.getArray();
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PAGE_STYLE);
+ const SfxItemPropertyMap* pMap = pPropSet->getPropertyMap();
+ SwStyleBase_Impl aBase(*GetDoc(), GetStyleName());
+ SfxStyleSheetBase* pBase = 0;
+ for(sal_Int32 nProp = 0; nProp < nLength; nProp++)
+ {
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName( pNames[nProp] );
+ if (!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + pNames[nProp], static_cast < cppu::OWeakObject * > ( this ) );
+
+ if(GetBasePool())
+ {
+ if(!pBase)
+ {
+ sal_uInt16 nSaveMask = GetBasePool()->GetSearchMask();
+ GetBasePool()->SetSearchMask(GetFamily(), SFXSTYLEBIT_ALL );
+ pBase = GetBasePool()->Find(GetStyleName());
+ GetBasePool()->SetSearchMask(GetFamily(), nSaveMask );
+ }
+ sal_uInt16 nRes = 0;
+ bool bHeader = false;
+ sal_Bool bAll = sal_False, bLeft = sal_False, bRight = sal_False;
+ switch(pEntry->nWID)
+ {
+ case FN_UNO_HEADER_ON:
+ case FN_UNO_HEADER_BACKGROUND:
+ case FN_UNO_HEADER_BOX:
+ case FN_UNO_HEADER_LR_SPACE:
+ case FN_UNO_HEADER_SHADOW:
+ case FN_UNO_HEADER_BODY_DISTANCE:
+ case FN_UNO_HEADER_IS_DYNAMIC_DISTANCE:
+ case FN_UNO_HEADER_SHARE_CONTENT:
+ case FN_UNO_HEADER_HEIGHT:
+ case FN_UNO_HEADER_EAT_SPACING:
+
+ case FN_UNO_FOOTER_ON:
+ case FN_UNO_FOOTER_BACKGROUND:
+ case FN_UNO_FOOTER_BOX:
+ case FN_UNO_FOOTER_LR_SPACE:
+ case FN_UNO_FOOTER_SHADOW:
+ case FN_UNO_FOOTER_BODY_DISTANCE:
+ case FN_UNO_FOOTER_IS_DYNAMIC_DISTANCE:
+ case FN_UNO_FOOTER_SHARE_CONTENT:
+ case FN_UNO_FOOTER_HEIGHT:
+ case FN_UNO_FOOTER_EAT_SPACING:
+ {
+ SfxStyleSheetBasePool* pBasePool2 = ((SwXPageStyle*)this)->GetBasePool();
+ pBasePool2->SetSearchMask(GetFamily());
+ SfxStyleSheetBase* pBase2 = pBasePool2->Find(GetStyleName());
+ if(pBase2)
+ {
+ rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+ const SfxItemSet& rSet = xStyle->GetItemSet();
+ sal_Bool bFooter = sal_False;
+ switch(pEntry->nWID)
+ {
+ case FN_UNO_FOOTER_ON:
+ bFooter = sal_True;
+ // kein break!
+ case FN_UNO_HEADER_ON:
+ {
+ //falls das SetItem nicht da ist, dann ist der Wert sal_False
+ BOOL bRet = sal_False;
+ pRet[nProp].setValue(&bRet, ::getCppuBooleanType());
+ nRes = SID_ATTR_PAGE_ON;
+ }
+ break;
+ case FN_UNO_FOOTER_BACKGROUND: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_BACKGROUND: nRes = RES_BACKGROUND;
+ break;
+ case FN_UNO_FOOTER_BOX: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_BOX: nRes = RES_BOX;
+ break;
+ case FN_UNO_FOOTER_LR_SPACE: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_LR_SPACE: nRes = RES_LR_SPACE;
+ break;
+ case FN_UNO_FOOTER_SHADOW: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_SHADOW: nRes = RES_SHADOW;
+ break;
+ case FN_UNO_FOOTER_BODY_DISTANCE: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_BODY_DISTANCE: nRes = RES_UL_SPACE;
+ break;
+ case FN_UNO_FOOTER_IS_DYNAMIC_DISTANCE: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_IS_DYNAMIC_DISTANCE: nRes = SID_ATTR_PAGE_DYNAMIC;
+ break;
+ case FN_UNO_FOOTER_SHARE_CONTENT: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_SHARE_CONTENT: nRes = SID_ATTR_PAGE_SHARED;
+ break;
+ case FN_UNO_FOOTER_HEIGHT: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_HEIGHT: nRes = SID_ATTR_PAGE_SIZE;
+ break;
+ case FN_UNO_FOOTER_EAT_SPACING: bFooter = sal_True;
+ // kein break;
+ case FN_UNO_HEADER_EAT_SPACING: nRes = RES_HEADER_FOOTER_EAT_SPACING;
+ break;
+ }
+ const SvxSetItem* pSetItem;
+ if(SFX_ITEM_SET == rSet.GetItemState(
+ bFooter ? SID_ATTR_PAGE_FOOTERSET : SID_ATTR_PAGE_HEADERSET,
+ sal_False, (const SfxPoolItem**)&pSetItem))
+ {
+ const SfxItemSet& rTmpSet = pSetItem->GetItemSet();
+ const SfxPoolItem* pItem = 0;
+ rTmpSet.GetItemState(nRes, sal_True, &pItem);
+ if(!pItem && nRes != rTmpSet.GetPool()->GetSlotId(nRes))
+ pItem = &rTmpSet.GetPool()->GetDefaultItem(nRes);
+ if(pItem)
+ pItem->QueryValue(pRet[nProp], pEntry->nMemberId);
+ }
+ }
+ }
+ break;
+ case FN_UNO_HEADER :
+ bAll = sal_True; goto Header;
+ case FN_UNO_HEADER_LEFT :
+ bLeft = sal_True; goto Header;
+ case FN_UNO_HEADER_RIGHT :
+ bRight = sal_True; goto Header;
+Header:
+ bHeader = true;
+ nRes = RES_HEADER; goto MakeObject;
+ case FN_UNO_FOOTER :
+ bAll = sal_True; goto Footer;
+ case FN_UNO_FOOTER_LEFT :
+ bLeft = sal_True; goto Footer;
+ case FN_UNO_FOOTER_RIGHT :
+ bRight = sal_True;
+Footer:
+ nRes = RES_FOOTER;
+MakeObject:
+ {
+ const SwPageDesc& rDesc = aBase.GetOldPageDesc();
+ const SwFrmFmt* pFrmFmt = 0;
+ sal_Bool bShare = (bHeader && rDesc.IsHeaderShared()) ||
+ (!bHeader && rDesc.IsFooterShared());
+ // TextLeft returns the left content if there is one,
+ // Text and TextRight return the master content.
+ // TextRight does the same as Text and is for
+ // comptability only.
+ if( bLeft && !bShare )
+ {
+ pFrmFmt = &rDesc.GetLeft();
+ }
+ else
+ {
+ pFrmFmt = &rDesc.GetMaster();
+ }
+ const uno::Reference< text::XText > xRet =
+ lcl_makeHeaderFooter(nRes, bHeader, pFrmFmt);
+ if (xRet.is())
+ {
+ pRet[nProp] <<= xRet;
+ }
+ }
+ break;
+ case FN_PARAM_FTN_INFO :
+ {
+ rtl::Reference< SwDocStyleSheet > xStyle( new SwDocStyleSheet( *(SwDocStyleSheet*)pBase ) );
+ const SfxItemSet& rSet = xStyle->GetItemSet();
+ const SfxPoolItem& rItem = rSet.Get(FN_PARAM_FTN_INFO);
+ rItem.QueryValue(pRet[nProp], pEntry->nMemberId);
+ }
+ break;
+ default:
+ pRet[nProp] = lcl_GetStyleProperty(*pEntry, *pPropSet, aBase, pBase, GetFamily(), GetDoc() );
+ }
+ }
+ else if(IsDescriptor())
+ {
+ uno::Any* pAny = 0;
+ GetPropImpl()->GetProperty(pNames[nProp], pAny);
+ if ( !pAny )
+ GetPropImpl()->GetProperty ( pNames[nProp], mxStyleData, pRet[ nProp ] );
+ else
+ pRet[nProp] = *pAny;
+ }
+ else
+ throw uno::RuntimeException();
+ }
+ return aRet;
+}
+
+uno::Sequence< uno::Any > SwXPageStyle::getPropertyValues(
+ const uno::Sequence< OUString >& rPropertyNames )
+ throw(uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ uno::Sequence< uno::Any > aValues;
+
+ // workaround for bad designed API
+ try
+ {
+ aValues = GetPropertyValues_Impl( rPropertyNames );
+ }
+ catch (beans::UnknownPropertyException &)
+ {
+ throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property exception caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ catch (lang::WrappedTargetException &)
+ {
+ throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "WrappedTargetException caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ }
+
+ return aValues;
+}
+
+uno::Any SwXPageStyle::getPropertyValue(const OUString& rPropertyName) throw(
+ beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ const uno::Sequence<OUString> aProperties(&rPropertyName, 1);
+ return GetPropertyValues_Impl(aProperties).getConstArray()[0];
+}
+
+void SwXPageStyle::setPropertyValue(const OUString& rPropertyName, const uno::Any& rValue)
+ throw( beans::UnknownPropertyException,
+ beans::PropertyVetoException,
+ lang::IllegalArgumentException,
+ lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ const uno::Sequence<OUString> aProperties(&rPropertyName, 1);
+ const uno::Sequence<uno::Any> aValues(&rValue, 1);
+ SetPropertyValues_Impl( aProperties, aValues );
+}
+
+SwXFrameStyle::SwXFrameStyle ( SwDoc *pDoc )
+: SwXStyle ( pDoc, SFX_STYLE_FAMILY_FRAME, FALSE)
+{
+}
+
+SwXFrameStyle::~SwXFrameStyle()
+{
+}
+
+uno::Sequence< uno::Type > SwXFrameStyle::getTypes( ) throw(uno::RuntimeException)
+{
+ uno::Sequence< uno::Type > aTypes = SwXStyle::getTypes();
+ sal_Int32 nLen = aTypes.getLength();
+ aTypes.realloc(nLen + 1);
+ aTypes.getArray()[nLen] = ::getCppuType((uno::Reference<XEventsSupplier>*)0);
+ return aTypes;
+}
+
+uno::Any SwXFrameStyle::queryInterface( const uno::Type& rType ) throw(uno::RuntimeException)
+{
+ uno::Any aRet;
+ if(rType == ::getCppuType((uno::Reference<XEventsSupplier>*)0))
+ aRet <<= uno::Reference<XEventsSupplier>(this);
+ else
+ aRet = SwXStyle::queryInterface(rType);
+ return aRet;
+}
+
+uno::Reference< container::XNameReplace > SwXFrameStyle::getEvents( ) throw(uno::RuntimeException)
+{
+ return new SwFrameStyleEventDescriptor( *this );
+}
+
+SwXAutoStyles::SwXAutoStyles(SwDocShell& rDocShell) :
+ SwUnoCollection(rDocShell.GetDoc()), pDocShell( &rDocShell )
+{
+}
+
+SwXAutoStyles::~SwXAutoStyles()
+{
+}
+
+sal_Int32 SwXAutoStyles::getCount(void) throw( uno::RuntimeException )
+{
+ return AUTOSTYLE_FAMILY_COUNT;
+}
+
+uno::Any SwXAutoStyles::getByIndex(sal_Int32 nIndex)
+ throw( lang::IndexOutOfBoundsException, lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ uno::Any aRet;
+ if(nIndex < 0 || nIndex >= AUTOSTYLE_FAMILY_COUNT)
+ throw lang::IndexOutOfBoundsException();
+ if(IsValid())
+ {
+ uno::Reference< style::XAutoStyleFamily > aRef;
+ IStyleAccess::SwAutoStyleFamily nType = aAutoStyleByIndex[nIndex];
+ switch( nType )
+ {
+ case IStyleAccess::AUTO_STYLE_CHAR:
+ {
+ if(!xAutoCharStyles.is())
+ xAutoCharStyles = new SwXAutoStyleFamily(pDocShell, nType);
+ aRef = xAutoCharStyles;
+ }
+ break;
+ case IStyleAccess::AUTO_STYLE_RUBY:
+ {
+ if(!xAutoRubyStyles.is())
+ xAutoRubyStyles = new SwXAutoStyleFamily(pDocShell, nType );
+ aRef = xAutoRubyStyles;
+ }
+ break;
+ case IStyleAccess::AUTO_STYLE_PARA:
+ {
+ if(!xAutoParaStyles.is())
+ xAutoParaStyles = new SwXAutoStyleFamily(pDocShell, nType );
+ aRef = xAutoParaStyles;
+ }
+ break;
+
+ default:
+ ;
+ }
+ aRet.setValue(&aRef, ::getCppuType((const uno::Reference<style::XAutoStyleFamily>*)0));
+ }
+ else
+ throw uno::RuntimeException();
+ return aRet;
+}
+
+uno::Type SwXAutoStyles::getElementType( ) throw(uno::RuntimeException)
+{
+ return ::getCppuType((const uno::Reference<style::XAutoStyleFamily>*)0);
+}
+
+sal_Bool SwXAutoStyles::hasElements( ) throw(uno::RuntimeException)
+{
+ return sal_True;
+}
+
+uno::Any SwXAutoStyles::getByName(const rtl::OUString& Name)
+ throw( container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ uno::Any aRet;
+ if(Name.compareToAscii("CharacterStyles") == 0 )
+ aRet = getByIndex(0);
+ else if(Name.compareToAscii("RubyStyles") == 0 )
+ aRet = getByIndex(1);
+ else if(Name.compareToAscii("ParagraphStyles") == 0 )
+ aRet = getByIndex(2);
+ else
+ throw container::NoSuchElementException();
+ return aRet;
+}
+
+uno::Sequence< rtl::OUString > SwXAutoStyles::getElementNames(void)
+ throw( uno::RuntimeException )
+{
+ uno::Sequence< OUString > aNames(AUTOSTYLE_FAMILY_COUNT);
+ OUString* pNames = aNames.getArray();
+ pNames[0] = C2U("CharacterStyles");
+ pNames[1] = C2U("RubyStyles");
+ pNames[2] = C2U("ParagraphStyles");
+ return aNames;
+}
+
+sal_Bool SwXAutoStyles::hasByName(const rtl::OUString& Name)
+ throw( uno::RuntimeException )
+{
+ if( Name.compareToAscii("CharacterStyles") == 0 ||
+ Name.compareToAscii("RubyStyles") == 0 ||
+ Name.compareToAscii("ParagraphStyles") == 0 )
+ return sal_True;
+ else
+ return sal_False;
+}
+
+SwXAutoStyleFamily::SwXAutoStyleFamily(SwDocShell* pDocSh, IStyleAccess::SwAutoStyleFamily nFamily) :
+ pDocShell( pDocSh ), eFamily(nFamily)
+{
+ // Register ourselves as a listener to the document (via the page descriptor)
+ pDocSh->GetDoc()->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+}
+
+SwXAutoStyleFamily::~SwXAutoStyleFamily()
+{
+}
+
+void SwXAutoStyleFamily::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ pDocShell = 0;
+}
+
+uno::Reference< style::XAutoStyle > SwXAutoStyleFamily::insertStyle(
+ const uno::Sequence< beans::PropertyValue >& Values )
+ throw (uno::RuntimeException)
+{
+ if( !pDocShell )
+ throw uno::RuntimeException();
+ const USHORT* pRange = 0;
+ const SfxItemPropertySet* pPropSet = 0;
+ switch( eFamily )
+ {
+ case IStyleAccess::AUTO_STYLE_CHAR:
+ {
+ pRange = aCharAutoFmtSetRange;
+ pPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_CHAR_AUTO_STYLE);
+ }
+ break;
+ case IStyleAccess::AUTO_STYLE_RUBY:
+ {
+ pRange = 0;//aTxtNodeSetRange;
+ pPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_RUBY_AUTO_STYLE);
+ }
+ break;
+ case IStyleAccess::AUTO_STYLE_PARA:
+ {
+ pRange = aTxtNodeSetRange;
+ pPropSet = aSwMapProvider.GetPropertySet(PROPERTY_MAP_PARA_AUTO_STYLE);
+ }
+ break;
+
+ default:
+ ;
+ }
+ SwAttrSet aSet( pDocShell->GetDoc()->GetAttrPool(), pRange );
+ const beans::PropertyValue* pSeq = Values.getConstArray();
+ sal_Int32 nLen = Values.getLength();
+ for( sal_Int32 i = 0; i < nLen; ++i )
+ {
+ try
+ {
+ pPropSet->setPropertyValue( pSeq[i].Name, pSeq[i].Value, aSet );
+ }
+ catch (beans::UnknownPropertyException &)
+ {
+ OSL_ENSURE( false, "Unknown property" );
+ }
+ catch (lang::IllegalArgumentException &)
+ {
+ OSL_ENSURE( false, "Illegal argument" );
+ }
+ }
+
+ SfxItemSet_Pointer_t pSet = pDocShell->GetDoc()->GetIStyleAccess().cacheAutomaticStyle( aSet, eFamily );
+ uno::Reference<style::XAutoStyle> xRet = new SwXAutoStyle(pDocShell->GetDoc(), pSet, eFamily);
+ return xRet;
+}
+
+uno::Reference< container::XEnumeration > SwXAutoStyleFamily::createEnumeration( )
+ throw (uno::RuntimeException)
+{
+ if( !pDocShell )
+ throw uno::RuntimeException();
+ return uno::Reference< container::XEnumeration >
+ (new SwXAutoStylesEnumerator( pDocShell->GetDoc(), eFamily ));
+}
+
+uno::Type SwXAutoStyleFamily::getElementType( ) throw(uno::RuntimeException)
+{
+ return ::getCppuType((const uno::Reference<style::XAutoStyle>*)0);
+}
+
+sal_Bool SwXAutoStyleFamily::hasElements( ) throw(uno::RuntimeException)
+{
+ return sal_False;
+}
+
+SwAutoStylesEnumImpl::SwAutoStylesEnumImpl( SwDoc* pInitDoc, IStyleAccess::SwAutoStyleFamily eFam )
+: pDoc( pInitDoc ), eFamily( eFam )
+{
+ // special case for ruby auto styles:
+ if ( IStyleAccess::AUTO_STYLE_RUBY == eFam )
+ {
+ std::set< std::pair< USHORT, USHORT > > aRubyMap;
+ SwAttrPool& rAttrPool = pDoc->GetAttrPool();
+ USHORT nCount = rAttrPool.GetItemCount( RES_TXTATR_CJK_RUBY );
+
+ for ( USHORT nI = 0; nI < nCount; ++nI )
+ {
+ const SwFmtRuby* pItem = static_cast<const SwFmtRuby*>(rAttrPool.GetItem( RES_TXTATR_CJK_RUBY, nI ));
+ if ( pItem && pItem->GetTxtRuby() )
+ {
+ std::pair< USHORT, USHORT > aPair( pItem->GetPosition(), pItem->GetAdjustment() );
+ if ( aRubyMap.find( aPair ) == aRubyMap.end() )
+ {
+ aRubyMap.insert( aPair );
+ SfxItemSet_Pointer_t pItemSet( new SfxItemSet( rAttrPool, RES_TXTATR_CJK_RUBY, RES_TXTATR_CJK_RUBY ) );
+ pItemSet->Put( *pItem );
+ mAutoStyles.push_back( pItemSet );
+ }
+ }
+ }
+ }
+ else
+ {
+ pDoc->GetIStyleAccess().getAllStyles( mAutoStyles, eFamily );
+ }
+
+ aIter = mAutoStyles.begin();
+}
+
+SwXAutoStylesEnumerator::SwXAutoStylesEnumerator( SwDoc* pDoc, IStyleAccess::SwAutoStyleFamily eFam )
+: pImpl( new SwAutoStylesEnumImpl( pDoc, eFam ) )
+{
+ // Register ourselves as a listener to the document (via the page descriptor)
+ pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+}
+
+SwXAutoStylesEnumerator::~SwXAutoStylesEnumerator()
+{
+ delete pImpl;
+}
+
+void SwXAutoStylesEnumerator::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ {
+ delete pImpl;
+ pImpl = 0;
+ }
+}
+
+::sal_Bool SwXAutoStylesEnumerator::hasMoreElements( )
+ throw (uno::RuntimeException)
+{
+ if( !pImpl )
+ throw uno::RuntimeException();
+ return pImpl->hasMoreElements();
+}
+
+uno::Any SwXAutoStylesEnumerator::nextElement( )
+ throw (container::NoSuchElementException, lang::WrappedTargetException, uno::RuntimeException)
+{
+ if( !pImpl )
+ throw uno::RuntimeException();
+ uno::Any aRet;
+ if( pImpl->hasMoreElements() )
+ {
+ SfxItemSet_Pointer_t pNextSet = pImpl->nextElement();
+ uno::Reference< style::XAutoStyle > xAutoStyle = new SwXAutoStyle(pImpl->getDoc(),
+ pNextSet, pImpl->getFamily());
+ aRet.setValue(&xAutoStyle, ::getCppuType((uno::Reference<style::XAutoStyle>*)0));
+ }
+ return aRet;
+}
+
+SwXAutoStyle::SwXAutoStyle( SwDoc* pDoc, SfxItemSet_Pointer_t pInitSet, IStyleAccess::SwAutoStyleFamily eFam )
+: pSet( pInitSet ), eFamily( eFam )
+{
+ // Register ourselves as a listener to the document (via the page descriptor)
+ pDoc->GetPageDescFromPool(RES_POOLPAGE_STANDARD)->Add(this);
+}
+
+SwXAutoStyle::~SwXAutoStyle()
+{
+}
+
+void SwXAutoStyle::Modify( SfxPoolItem *pOld, SfxPoolItem *pNew)
+{
+ ClientModify(this, pOld, pNew);
+ if(!GetRegisteredIn())
+ pSet.reset();
+}
+
+uno::Reference< beans::XPropertySetInfo > SwXAutoStyle::getPropertySetInfo( )
+ throw (uno::RuntimeException)
+{
+ uno::Reference< beans::XPropertySetInfo > xRet;
+ switch( eFamily )
+ {
+ case IStyleAccess::AUTO_STYLE_CHAR:
+ {
+ static uno::Reference< beans::XPropertySetInfo > xCharRef;
+ if(!xCharRef.is())
+ {
+ xCharRef = aSwMapProvider.GetPropertySet(PROPERTY_MAP_CHAR_AUTO_STYLE)->getPropertySetInfo();
+ }
+ xRet = xCharRef;
+ }
+ break;
+ case IStyleAccess::AUTO_STYLE_RUBY:
+ {
+ static uno::Reference< beans::XPropertySetInfo > xRubyRef;
+ if(!xRubyRef.is())
+ {
+ sal_uInt16 nMapId = PROPERTY_MAP_RUBY_AUTO_STYLE;
+ xRubyRef = aSwMapProvider.GetPropertySet(nMapId)->getPropertySetInfo();
+ }
+ xRet = xRubyRef;
+ }
+ break;
+ case IStyleAccess::AUTO_STYLE_PARA:
+ {
+ static uno::Reference< beans::XPropertySetInfo > xParaRef;
+ if(!xParaRef.is())
+ {
+ sal_uInt16 nMapId = PROPERTY_MAP_PARA_AUTO_STYLE;
+ xParaRef = aSwMapProvider.GetPropertySet(nMapId)->getPropertySetInfo();
+ }
+ xRet = xParaRef;
+ }
+ break;
+
+ default:
+ ;
+ }
+
+ return xRet;
+}
+
+void SwXAutoStyle::setPropertyValue( const OUString& /*rPropertyName*/, const uno::Any& /*rValue*/ )
+ throw( beans::UnknownPropertyException,
+ beans::PropertyVetoException,
+ lang::IllegalArgumentException,
+ lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+}
+
+uno::Any SwXAutoStyle::getPropertyValue( const OUString& rPropertyName )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+ SolarMutexGuard aGuard;
+ const uno::Sequence<OUString> aProperties(&rPropertyName, 1);
+ return GetPropertyValues_Impl(aProperties).getConstArray()[0];
+}
+
+void SwXAutoStyle::addPropertyChangeListener( const OUString& /*aPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/ )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+}
+
+void SwXAutoStyle::removePropertyChangeListener( const OUString& /*aPropertyName*/,
+ const uno::Reference< beans::XPropertyChangeListener >& /*aListener*/ )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+}
+
+void SwXAutoStyle::addVetoableChangeListener( const OUString& /*PropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+}
+
+void SwXAutoStyle::removeVetoableChangeListener( const OUString& /*PropertyName*/,
+ const uno::Reference< beans::XVetoableChangeListener >& /*aListener*/ )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException )
+{
+}
+
+void SwXAutoStyle::setPropertyValues(
+ const uno::Sequence< ::rtl::OUString >& /*aPropertyNames*/,
+ const uno::Sequence< uno::Any >& /*aValues*/ )
+ throw (beans::PropertyVetoException, lang::IllegalArgumentException,
+ lang::WrappedTargetException, uno::RuntimeException)
+{
+}
+
+uno::Sequence< uno::Any > SwXAutoStyle::GetPropertyValues_Impl(
+ const uno::Sequence< OUString > & rPropertyNames )
+ throw( beans::UnknownPropertyException, lang::WrappedTargetException, uno::RuntimeException )
+{
+ if( !pSet.get() )
+ throw uno::RuntimeException();
+ // query_item
+
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_AUTO_STYLE;
+ switch(eFamily)
+ {
+ case IStyleAccess::AUTO_STYLE_CHAR : nPropSetId = PROPERTY_MAP_CHAR_AUTO_STYLE; break;
+ case IStyleAccess::AUTO_STYLE_RUBY : nPropSetId = PROPERTY_MAP_RUBY_AUTO_STYLE; break;
+ case IStyleAccess::AUTO_STYLE_PARA : nPropSetId = PROPERTY_MAP_PARA_AUTO_STYLE; break;
+ default:
+ ;
+ }
+
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+ const OUString* pNames = rPropertyNames.getConstArray();
+
+ sal_Int32 nLen = rPropertyNames.getLength();
+ uno::Sequence< uno::Any > aRet( nLen );
+ uno::Any* pValues = aRet.getArray();
+
+ SfxItemSet& rSet = *pSet.get();
+
+ for( sal_Int32 i = 0; i < nLen; ++i )
+ {
+ const String& rPropName = pNames[i];
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName(rPropName);
+ if(!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropName, static_cast < cppu::OWeakObject * > ( this ) );
+ else if ( RES_TXTATR_AUTOFMT == pEntry->nWID || RES_AUTO_STYLE == pEntry->nWID )
+ {
+ OUString sName(StylePool::nameOf( pSet ));
+ pValues[i] <<= sName;
+ }
+ else
+ pPropSet->getPropertyValue( *pEntry, rSet, pValues[i] );
+ }
+ return aRet;
+}
+
+uno::Sequence< uno::Any > SwXAutoStyle::getPropertyValues (
+ const uno::Sequence< ::rtl::OUString >& rPropertyNames )
+ throw (uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+ uno::Sequence< uno::Any > aValues;
+
+ // workaround for bad designed API
+ try
+ {
+ aValues = GetPropertyValues_Impl( rPropertyNames );
+ }
+ catch (beans::UnknownPropertyException &)
+ {
+ throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property exception caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ }
+ catch (lang::WrappedTargetException &)
+ {
+ throw uno::RuntimeException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "WrappedTargetException caught" ) ), static_cast < cppu::OWeakObject * > ( this ) );
+ }
+
+ return aValues;
+}
+
+void SwXAutoStyle::addPropertiesChangeListener(
+ const uno::Sequence< ::rtl::OUString >& /*aPropertyNames*/,
+ const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
+ throw (uno::RuntimeException)
+{
+}
+
+void SwXAutoStyle::removePropertiesChangeListener(
+ const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
+ throw (uno::RuntimeException)
+{
+}
+
+void SwXAutoStyle::firePropertiesChangeEvent(
+ const uno::Sequence< ::rtl::OUString >& /*aPropertyNames*/,
+ const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ )
+ throw (uno::RuntimeException)
+{
+}
+
+beans::PropertyState SwXAutoStyle::getPropertyState( const OUString& rPropertyName )
+ throw( beans::UnknownPropertyException,
+ uno::RuntimeException)
+{
+ SolarMutexGuard aGuard;
+
+ uno::Sequence< OUString > aNames(1);
+ OUString* pNames = aNames.getArray();
+ pNames[0] = rPropertyName;
+ uno::Sequence< beans::PropertyState > aStates = getPropertyStates(aNames);
+ return aStates.getConstArray()[0];
+}
+
+void SwXAutoStyle::setPropertyToDefault( const OUString& /*PropertyName*/ )
+ throw( beans::UnknownPropertyException,
+ uno::RuntimeException )
+{
+}
+
+uno::Any SwXAutoStyle::getPropertyDefault( const OUString& rPropertyName )
+ throw( beans::UnknownPropertyException,
+ lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+ const uno::Sequence < OUString > aSequence ( &rPropertyName, 1 );
+ return getPropertyDefaults ( aSequence ).getConstArray()[0];
+}
+
+uno::Sequence< beans::PropertyState > SwXAutoStyle::getPropertyStates(
+ const uno::Sequence< ::rtl::OUString >& rPropertyNames )
+ throw (beans::UnknownPropertyException, uno::RuntimeException)
+{
+ if( !pSet.get() )
+ throw uno::RuntimeException();
+ SolarMutexGuard aGuard;
+ uno::Sequence< beans::PropertyState > aRet(rPropertyNames.getLength());
+ beans::PropertyState* pStates = aRet.getArray();
+ const OUString* pNames = rPropertyNames.getConstArray();
+
+ sal_Int8 nPropSetId = PROPERTY_MAP_CHAR_AUTO_STYLE;
+ switch(eFamily)
+ {
+ case IStyleAccess::AUTO_STYLE_CHAR : nPropSetId = PROPERTY_MAP_CHAR_AUTO_STYLE; break;
+ case IStyleAccess::AUTO_STYLE_RUBY : nPropSetId = PROPERTY_MAP_RUBY_AUTO_STYLE; break;
+ case IStyleAccess::AUTO_STYLE_PARA : nPropSetId = PROPERTY_MAP_PARA_AUTO_STYLE; break;
+ default:
+ ;
+ }
+
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+ SfxItemSet& rSet = *pSet.get();
+ for(sal_Int32 i = 0; i < rPropertyNames.getLength(); i++)
+ {
+ const String& rPropName = pNames[i];
+ const SfxItemPropertySimpleEntry* pEntry = pMap->getByName(rPropName);
+ if(!pEntry)
+ throw beans::UnknownPropertyException(OUString ( RTL_CONSTASCII_USTRINGPARAM ( "Unknown property: " ) ) + rPropName, static_cast < cppu::OWeakObject * > ( this ) );
+ pStates[i] = pPropSet->getPropertyState(*pEntry, rSet );
+ }
+ return aRet;
+}
+
+void SwXAutoStyle::setAllPropertiesToDefault( )
+ throw (uno::RuntimeException)
+{
+}
+
+void SwXAutoStyle::setPropertiesToDefault(
+ const uno::Sequence< ::rtl::OUString >& /*aPropertyNames*/ )
+ throw (beans::UnknownPropertyException, uno::RuntimeException)
+{
+}
+
+uno::Sequence< uno::Any > SwXAutoStyle::getPropertyDefaults(
+ const uno::Sequence< ::rtl::OUString >& /*aPropertyNames*/ )
+ throw (beans::UnknownPropertyException, lang::WrappedTargetException,
+ uno::RuntimeException)
+{
+ uno::Sequence< uno::Any > aRet(0);
+ return aRet;
+}
+
+uno::Sequence< beans::PropertyValue > SwXAutoStyle::getProperties() throw (uno::RuntimeException)
+{
+ if( !pSet.get() )
+ throw uno::RuntimeException();
+ SolarMutexGuard aGuard;
+ std::vector< beans::PropertyValue > aPropertyVector;
+
+ sal_Int8 nPropSetId = 0;
+ switch(eFamily)
+ {
+ case IStyleAccess::AUTO_STYLE_CHAR : nPropSetId = PROPERTY_MAP_CHAR_AUTO_STYLE; break;
+ case IStyleAccess::AUTO_STYLE_RUBY : nPropSetId = PROPERTY_MAP_RUBY_AUTO_STYLE; break;
+ case IStyleAccess::AUTO_STYLE_PARA : nPropSetId = PROPERTY_MAP_PARA_AUTO_STYLE; break;
+ default:
+ ;
+ }
+
+ const SfxItemPropertySet* pPropSet = aSwMapProvider.GetPropertySet(nPropSetId);
+ const SfxItemPropertyMap *pMap = pPropSet->getPropertyMap();
+ PropertyEntryVector_t aPropVector = pMap->getPropertyEntries();
+// struct compareWhichIds
+// {
+// bool operator()(const USHORT w1, const USHORT w2) const
+// {
+// return w1 < w2;
+// }
+// };
+// typedef std::map<const USHORT, SfxItemPropertyNamedEntry, compareWhichIds> PropertyMap_t;
+// PropertyMap_t aPropMap;
+// aPropMap.reserve( aPropVector.size() );
+// PropertyEntryVector_t::const_iterator aIt = aPropertyEntries.begin();
+// while( aIt != aPropertyEntries.end() )
+// {
+// aPropMap[aIt->nWID] = *aIt;
+// ++aIt;
+// }
+
+ SfxItemSet& rSet = *pSet.get();
+ SfxItemIter aIter(rSet);
+ const SfxPoolItem* pItem = aIter.FirstItem();
+
+ while ( pItem )
+ {
+ const USHORT nWID = pItem->Which();
+
+// PropertyMap_t::const_iterator aMapIt = aPropMap[nWID];
+// if( aMapIt != aPropMap.getEnd() )
+// {
+// beans::PropertyValue aPropertyValue;
+// aPropertyValue.Name = aIt->sName;
+// pItem->QueryValue( aPropertyValue.Value, aIt->nMemberId );
+// aPropertyVector.push_back( aPropertyValue );
+// }
+ // TODO: Optimize - and fix! the old iteration filled each WhichId
+ // only once but there are more properties than WhichIds
+ PropertyEntryVector_t::const_iterator aIt = aPropVector.begin();
+ while( aIt != aPropVector.end() )
+ {
+ if ( aIt->nWID == nWID )
+ {
+ beans::PropertyValue aPropertyValue;
+ aPropertyValue.Name = aIt->sName;
+ pItem->QueryValue( aPropertyValue.Value, aIt->nMemberId );
+ aPropertyVector.push_back( aPropertyValue );
+ }
+ ++aIt;
+ }
+/* int i = 0;
+ while ( pMap[i].nWID != 0 )
+ {
+ if ( pMap[i].nWID == nWID )
+ {
+ beans::PropertyValue aPropertyValue;
+ String sString( OUString::createFromAscii( pMap[i].pName ) );
+ aPropertyValue.Name = sString;
+ pItem->QueryValue( aPropertyValue.Value, pMap[i].nMemberId );
+ aPropertyVector.push_back( aPropertyValue );
+ break;
+ }
+ ++i;
+ }*/
+ pItem = aIter.NextItem();
+ }
+
+ const sal_Int32 nCount = aPropertyVector.size();
+ uno::Sequence< beans::PropertyValue > aRet( nCount );
+ beans::PropertyValue* pProps = aRet.getArray();
+
+ for ( int i = 0; i < nCount; ++i, pProps++ )
+ {
+ *pProps = aPropertyVector[i];
+ }
+
+ return aRet;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */