| /************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, |
| * software distributed under the License is distributed on an |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| * KIND, either express or implied. See the License for the |
| * specific language governing permissions and limitations |
| * under the License. |
| * |
| *************************************************************/ |
| |
| |
| |
| // MARKER(update_precomp.py): autogen include statement, do not remove |
| #include "precompiled_sw.hxx" |
| |
| #include <com/sun/star/beans/PropertyAttribute.hpp> |
| #include <com/sun/star/text/SectionFileLink.hpp> |
| |
| #include <cmdid.h> |
| #include <hintids.hxx> |
| #include <svl/urihelper.hxx> |
| #include <editeng/brshitem.hxx> |
| #include <editeng/xmlcnitm.hxx> |
| #include <sfx2/linkmgr.hxx> |
| #include <sfx2/lnkbase.hxx> |
| #include <vos/mutex.hxx> |
| #include <vcl/svapp.hxx> |
| #include <fmtclds.hxx> |
| #include <unotextrange.hxx> |
| #include <unosection.hxx> |
| #include <TextCursorHelper.hxx> |
| #include <unoredline.hxx> |
| #include <redline.hxx> |
| #include <unomap.hxx> |
| #include <unocrsr.hxx> |
| #include <section.hxx> |
| #include <doc.hxx> |
| #include <IDocumentUndoRedo.hxx> |
| #include <docsh.hxx> |
| #include <sfx2/docfile.hxx> |
| #include <docary.hxx> |
| #include <swundo.hxx> |
| #include <hints.hxx> |
| #include <tox.hxx> |
| #include <unoidx.hxx> |
| #include <doctxm.hxx> |
| #include <fmtftntx.hxx> |
| #include <fmtclbl.hxx> |
| #include <com/sun/star/beans/PropertyAttribute.hpp> |
| #include <editeng/frmdiritem.hxx> |
| #include <fmtcntnt.hxx> |
| /* #109700# */ |
| #include <editeng/lrspitem.hxx> |
| |
| |
| using namespace ::com::sun::star; |
| using ::rtl::OUString; |
| |
| |
| /****************************************************************** |
| * |
| ******************************************************************/ |
| struct SwTextSectionProperties_Impl |
| { |
| uno::Sequence<sal_Int8> m_Password; |
| ::rtl::OUString m_sCondition; |
| ::rtl::OUString m_sLinkFileName; |
| ::rtl::OUString m_sSectionFilter; |
| ::rtl::OUString m_sSectionRegion; |
| |
| ::std::auto_ptr<SwFmtCol> m_pColItem; |
| ::std::auto_ptr<SvxBrushItem> m_pBrushItem; |
| ::std::auto_ptr<SwFmtFtnAtTxtEnd> m_pFtnItem; |
| ::std::auto_ptr<SwFmtEndAtTxtEnd> m_pEndItem; |
| ::std::auto_ptr<SvXMLAttrContainerItem> m_pXMLAttr; |
| ::std::auto_ptr<SwFmtNoBalancedColumns> m_pNoBalanceItem; |
| ::std::auto_ptr<SvxFrameDirectionItem> m_pFrameDirItem; |
| ::std::auto_ptr<SvxLRSpaceItem> m_pLRSpaceItem; // #109700# |
| |
| bool m_bDDE; |
| bool m_bHidden; |
| bool m_bCondHidden; |
| bool m_bProtect; |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| bool m_bEditInReadonly; |
| // <-- |
| bool m_bUpdateType; |
| |
| SwTextSectionProperties_Impl() |
| : m_bDDE(false) |
| , m_bHidden(false) |
| , m_bCondHidden(false) |
| , m_bProtect(false) |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| , m_bEditInReadonly(false) |
| // <-- |
| , m_bUpdateType(true) |
| { |
| } |
| |
| }; |
| |
| |
| class SwXTextSection::Impl |
| : public SwClient |
| { |
| |
| public: |
| |
| SwXTextSection & m_rThis; |
| const SfxItemPropertySet & m_rPropSet; |
| SwEventListenerContainer m_ListenerContainer; |
| const bool m_bIndexHeader; |
| bool m_bIsDescriptor; |
| ::rtl::OUString m_sName; |
| ::std::auto_ptr<SwTextSectionProperties_Impl> m_pProps; |
| |
| Impl( SwXTextSection & rThis, |
| SwSectionFmt *const pFmt, const bool bIndexHeader) |
| : SwClient(pFmt) |
| , m_rThis(rThis) |
| , m_rPropSet(*aSwMapProvider.GetPropertySet(PROPERTY_MAP_SECTION)) |
| , m_ListenerContainer(static_cast< ::cppu::OWeakObject* >(&rThis)) |
| , m_bIndexHeader(bIndexHeader) |
| // #i111177# unxsols4 (Sun C++ 5.9 SunOS_sparc) may generate wrong code |
| , m_bIsDescriptor((0 == pFmt) ? true : false) |
| , m_pProps((pFmt) ? 0 : new SwTextSectionProperties_Impl()) |
| { |
| } |
| |
| SwSectionFmt * GetSectionFmt() const |
| { |
| return static_cast<SwSectionFmt*>(const_cast<SwModify*>( |
| GetRegisteredIn())); |
| } |
| |
| SwSectionFmt & GetSectionFmtOrThrow() const { |
| SwSectionFmt *const pFmt( GetSectionFmt() ); |
| if (!pFmt) { |
| throw uno::RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "SwXTextSection: disposed or invalid")), 0); |
| } |
| return *pFmt; |
| } |
| |
| void SAL_CALL SetPropertyValues_Impl( |
| const uno::Sequence< ::rtl::OUString >& rPropertyNames, |
| const uno::Sequence< uno::Any >& aValues) |
| throw (beans::UnknownPropertyException, beans::PropertyVetoException, |
| lang::IllegalArgumentException, lang::WrappedTargetException, |
| uno::RuntimeException); |
| uno::Sequence< uno::Any > SAL_CALL |
| GetPropertyValues_Impl( |
| const uno::Sequence< ::rtl::OUString >& rPropertyNames) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException); |
| protected: |
| // SwClient |
| virtual void Modify(const SfxPoolItem *pOld, const SfxPoolItem *pNew); |
| |
| }; |
| |
| /*-- 10.12.98 14:42:52--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SwXTextSection::Impl::Modify( const SfxPoolItem *pOld, const SfxPoolItem *pNew) |
| { |
| ClientModify(this, pOld, pNew); |
| if (!GetRegisteredIn()) |
| { |
| m_ListenerContainer.Disposing(); |
| } |
| } |
| |
| /*-- 20.12.2005 10:27:33--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| SwSectionFmt * SwXTextSection::GetFmt() const |
| { |
| return m_pImpl->GetSectionFmt(); |
| } |
| |
| /*-- 20.12.2005 09:56:36--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Reference< text::XTextSection > |
| SwXTextSection::CreateXTextSection( |
| SwSectionFmt *const pFmt, const bool bIndexHeader) |
| { |
| // re-use existing SwXTextSection |
| // #i105557#: do not iterate over the registered clients: race condition |
| uno::Reference< text::XTextSection > xSection; |
| if (pFmt) |
| { |
| xSection.set(pFmt->GetXTextSection()); |
| } |
| if ( !xSection.is() ) |
| { |
| SwXTextSection *const pNew = new SwXTextSection(pFmt, bIndexHeader); |
| xSection.set(pNew); |
| if (pFmt) |
| { |
| pFmt->SetXTextSection(xSection); |
| } |
| } |
| return xSection; |
| } |
| |
| /*-- 10.12.98 14:47:05--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| SwXTextSection::SwXTextSection( |
| SwSectionFmt *const pFmt, const bool bIndexHeader) |
| : m_pImpl( new SwXTextSection::Impl(*this, pFmt, bIndexHeader) ) |
| { |
| } |
| |
| /*-- 10.12.98 14:47:07--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| SwXTextSection::~SwXTextSection() |
| { |
| } |
| |
| /* -----------------------------13.03.00 12:15-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| const uno::Sequence< sal_Int8 > & SwXTextSection::getUnoTunnelId() |
| { |
| static uno::Sequence< sal_Int8 > aSeq = ::CreateUnoTunnelId(); |
| return aSeq; |
| } |
| /* -----------------------------10.03.00 18:04-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| sal_Int64 SAL_CALL |
| SwXTextSection::getSomething(const uno::Sequence< sal_Int8 >& rId) |
| throw (uno::RuntimeException) |
| { |
| return ::sw::UnoTunnelImpl<SwXTextSection>(rId, this); |
| } |
| |
| /*-- 10.12.98 14:47:08--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Reference< text::XTextSection > SAL_CALL |
| SwXTextSection::getParentSection() throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| SwSectionFmt & rSectionFmt( m_pImpl->GetSectionFmtOrThrow() ); |
| |
| SwSectionFmt *const pParentFmt = rSectionFmt.GetParent(); |
| const uno::Reference< text::XTextSection > xRet = |
| (pParentFmt) ? CreateXTextSection(pParentFmt) : 0; |
| return xRet; |
| } |
| |
| /*-- 10.12.98 14:47:08--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Sequence< uno::Reference< text::XTextSection > > SAL_CALL |
| SwXTextSection::getChildSections() throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| SwSectionFmt & rSectionFmt( m_pImpl->GetSectionFmtOrThrow() ); |
| |
| SwSections aChildren; |
| rSectionFmt.GetChildSections(aChildren, SORTSECT_NOT, sal_False); |
| uno::Sequence<uno::Reference<text::XTextSection> > aSeq(aChildren.Count()); |
| uno::Reference< text::XTextSection > * pArray = aSeq.getArray(); |
| for (sal_uInt16 i = 0; i < aChildren.Count(); i++) |
| { |
| SwSectionFmt *const pChild = aChildren.GetObject(i)->GetFmt(); |
| pArray[i] = CreateXTextSection(pChild); |
| } |
| return aSeq; |
| } |
| |
| /* -----------------18.02.99 13:31------------------- |
| * |
| * --------------------------------------------------*/ |
| void SAL_CALL |
| SwXTextSection::attach(const uno::Reference< text::XTextRange > & xTextRange) |
| throw (lang::IllegalArgumentException, uno::RuntimeException) |
| { |
| vos::OGuard g(Application::GetSolarMutex()); |
| |
| if (!m_pImpl->m_bIsDescriptor) |
| { |
| throw uno::RuntimeException(); |
| } |
| |
| uno::Reference<lang::XUnoTunnel> xRangeTunnel( xTextRange, uno::UNO_QUERY); |
| SwXTextRange* pRange = 0; |
| OTextCursorHelper* pCursor = 0; |
| if(xRangeTunnel.is()) |
| { |
| pRange = ::sw::UnoTunnelGetImplementation<SwXTextRange>(xRangeTunnel); |
| pCursor = |
| ::sw::UnoTunnelGetImplementation<OTextCursorHelper>(xRangeTunnel); |
| } |
| |
| SwDoc *const pDoc = |
| (pRange) ? pRange->GetDoc() : ((pCursor) ? pCursor->GetDoc() : 0); |
| if (!pDoc) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| |
| SwUnoInternalPaM aPam(*pDoc); |
| //das muss jetzt sal_True liefern |
| ::sw::XTextRangeToSwPaM(aPam, xTextRange); |
| UnoActionContext aCont(pDoc); |
| pDoc->GetIDocumentUndoRedo().StartUndo( UNDO_INSSECTION, NULL ); |
| |
| if (!m_pImpl->m_sName.getLength()) |
| { |
| m_pImpl->m_sName = C2U("TextSection"); |
| } |
| SectionType eType = (m_pImpl->m_pProps->m_bDDE) |
| ? DDE_LINK_SECTION |
| : ((m_pImpl->m_pProps->m_sLinkFileName.getLength() || |
| m_pImpl->m_pProps->m_sSectionRegion.getLength()) |
| ? FILE_LINK_SECTION : CONTENT_SECTION); |
| // index header section? |
| if (m_pImpl->m_bIndexHeader) |
| { |
| // caller wants an index header section, but will only |
| // give him one if a) we are inside an index, and b) said |
| // index doesn't yet have a header section. |
| const SwTOXBase* pBase = aPam.GetDoc()->GetCurTOX(*aPam.Start()); |
| |
| // are we inside an index? |
| if (pBase) |
| { |
| // get all child sections |
| SwSections aSectionsArr; |
| static_cast<const SwTOXBaseSection*>(pBase)->GetFmt()-> |
| GetChildSections(aSectionsArr); |
| |
| // and search for current header section |
| const sal_uInt16 nCount = aSectionsArr.Count(); |
| sal_Bool bHeaderPresent = sal_False; |
| for(sal_uInt16 i = 0; i < nCount; i++) |
| { |
| bHeaderPresent |= |
| (aSectionsArr[i]->GetType() == TOX_HEADER_SECTION); |
| } |
| if (! bHeaderPresent) |
| { |
| eType = TOX_HEADER_SECTION; |
| } |
| } |
| } |
| |
| String tmp(m_pImpl->m_sName); |
| SwSectionData aSect(eType, pDoc->GetUniqueSectionName(&tmp)); |
| aSect.SetCondition(m_pImpl->m_pProps->m_sCondition); |
| ::rtl::OUStringBuffer sLinkNameBuf(m_pImpl->m_pProps->m_sLinkFileName); |
| sLinkNameBuf.append(sfx2::cTokenSeperator); |
| sLinkNameBuf.append(m_pImpl->m_pProps->m_sSectionFilter); |
| sLinkNameBuf.append(sfx2::cTokenSeperator); |
| sLinkNameBuf.append(m_pImpl->m_pProps->m_sSectionRegion); |
| aSect.SetLinkFileName(sLinkNameBuf.makeStringAndClear()); |
| |
| aSect.SetHidden(m_pImpl->m_pProps->m_bHidden); |
| aSect.SetProtectFlag(m_pImpl->m_pProps->m_bProtect); |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| aSect.SetEditInReadonlyFlag(m_pImpl->m_pProps->m_bEditInReadonly); |
| // <-- |
| |
| SfxItemSet aSet(pDoc->GetAttrPool(), |
| RES_COL, RES_COL, |
| RES_BACKGROUND, RES_BACKGROUND, |
| RES_FTN_AT_TXTEND, RES_FRAMEDIR, |
| RES_LR_SPACE, RES_LR_SPACE, // #109700# |
| RES_UNKNOWNATR_CONTAINER,RES_UNKNOWNATR_CONTAINER, |
| 0); |
| if (m_pImpl->m_pProps->m_pBrushItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pBrushItem); |
| } |
| if (m_pImpl->m_pProps->m_pColItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pColItem); |
| } |
| if (m_pImpl->m_pProps->m_pFtnItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pFtnItem); |
| } |
| if (m_pImpl->m_pProps->m_pEndItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pEndItem); |
| } |
| if (m_pImpl->m_pProps->m_pXMLAttr.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pXMLAttr); |
| } |
| if (m_pImpl->m_pProps->m_pNoBalanceItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pNoBalanceItem); |
| } |
| if (m_pImpl->m_pProps->m_pFrameDirItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pFrameDirItem); |
| } |
| /* #109700# */ |
| if (m_pImpl->m_pProps->m_pLRSpaceItem.get()) |
| { |
| aSet.Put(*m_pImpl->m_pProps->m_pLRSpaceItem); |
| } |
| // section password |
| if (m_pImpl->m_pProps->m_Password.getLength() > 0) |
| { |
| aSect.SetPassword(m_pImpl->m_pProps->m_Password); |
| } |
| |
| SwSection *const pRet = |
| pDoc->InsertSwSection( aPam, aSect, 0, aSet.Count() ? &aSet : 0 ); |
| if( pRet ) |
| { |
| pRet->GetFmt()->Add(m_pImpl.get()); |
| pRet->GetFmt()->SetXObject(static_cast< ::cppu::OWeakObject*>(this)); |
| |
| // XML import must hide sections depending on their old condition status |
| if (m_pImpl->m_pProps->m_sCondition.getLength() != 0) |
| pRet->SetCondHidden(m_pImpl->m_pProps->m_bCondHidden); |
| |
| // set update type if DDE link (and connect, if necessary) |
| if (m_pImpl->m_pProps->m_bDDE) |
| { |
| if (! pRet->IsConnected()) |
| pRet->CreateLink(CREATE_CONNECT); |
| |
| pRet->SetUpdateType( static_cast< sal_uInt16 >( |
| (m_pImpl->m_pProps->m_bUpdateType) ? |
| sfx2::LINKUPDATE_ALWAYS : sfx2::LINKUPDATE_ONCALL) ); |
| } |
| } |
| |
| // end section undo here |
| pDoc->GetIDocumentUndoRedo().EndUndo( UNDO_INSSECTION, NULL ); |
| m_pImpl->m_pProps.reset(); |
| m_pImpl->m_bIsDescriptor = false; |
| } |
| |
| /*-- 10.12.98 14:47:09--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Reference< text::XTextRange > SAL_CALL |
| SwXTextSection::getAnchor() throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| uno::Reference< text::XTextRange > xRet; |
| SwSectionFmt *const pSectFmt = m_pImpl->GetSectionFmt(); |
| if(pSectFmt) |
| { |
| const SwSection* pSect; |
| const SwNodeIndex* pIdx; |
| if( 0 != ( pSect = pSectFmt->GetSection() ) && |
| 0 != ( pIdx = pSectFmt->GetCntnt().GetCntntIdx() ) && |
| pIdx->GetNode().GetNodes().IsDocNodes() ) |
| { |
| SwPaM aPaM(*pIdx); |
| aPaM.Move( fnMoveForward, fnGoCntnt ); |
| |
| const SwEndNode* pEndNode = pIdx->GetNode().EndOfSectionNode(); |
| SwPaM aEnd(*pEndNode); |
| aEnd.Move( fnMoveBackward, fnGoCntnt ); |
| xRet = SwXTextRange::CreateXTextRange(*pSectFmt->GetDoc(), |
| *aPaM.Start(), aEnd.Start()); |
| } |
| } |
| return xRet; |
| } |
| /*-- 10.12.98 14:47:09--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::dispose() throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| SwSectionFmt *const pSectFmt = m_pImpl->GetSectionFmt(); |
| if (pSectFmt) |
| { |
| pSectFmt->GetDoc()->DelSectionFmt( pSectFmt ); |
| } |
| } |
| /*-- 10.12.98 14:47:10--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::addEventListener( |
| const uno::Reference< lang::XEventListener > & xListener) |
| throw (uno::RuntimeException) |
| { |
| vos::OGuard g(Application::GetSolarMutex()); |
| |
| if (!m_pImpl->GetSectionFmt()) |
| { |
| throw uno::RuntimeException(); |
| } |
| m_pImpl->m_ListenerContainer.AddListener(xListener); |
| } |
| /*-- 10.12.98 14:47:10--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::removeEventListener( |
| const uno::Reference< lang::XEventListener > & xListener) |
| throw (uno::RuntimeException) |
| { |
| vos::OGuard g(Application::GetSolarMutex()); |
| |
| if (!m_pImpl->GetSectionFmt() || |
| !m_pImpl->m_ListenerContainer.RemoveListener(xListener)) |
| { |
| throw uno::RuntimeException(); |
| } |
| } |
| /*-- 10.12.98 14:47:11--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Reference< beans::XPropertySetInfo > SAL_CALL |
| SwXTextSection::getPropertySetInfo() throw (uno::RuntimeException) |
| { |
| vos::OGuard g(Application::GetSolarMutex()); |
| |
| static const uno::Reference< beans::XPropertySetInfo > aRef = |
| m_pImpl->m_rPropSet.getPropertySetInfo(); |
| return aRef; |
| } |
| |
| /* -----------------------------12.02.01 10:45-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| static void |
| lcl_UpdateLinkType(SwSection & rSection, bool const bLinkUpdateAlways = true) |
| { |
| if (rSection.GetType() == DDE_LINK_SECTION) |
| { |
| // set update type; needs an established link |
| if (!rSection.IsConnected()) |
| { |
| rSection.CreateLink(CREATE_CONNECT); |
| } |
| rSection.SetUpdateType( static_cast< sal_uInt16 >((bLinkUpdateAlways) |
| ? sfx2::LINKUPDATE_ALWAYS : sfx2::LINKUPDATE_ONCALL) ); |
| } |
| } |
| |
| static void |
| lcl_UpdateSection(SwSectionFmt *const pFmt, |
| ::std::auto_ptr<SwSectionData> const& pSectionData, |
| ::std::auto_ptr<SfxItemSet> const& pItemSet, |
| bool const bLinkModeChanged, bool const bLinkUpdateAlways = true) |
| { |
| if (pFmt) |
| { |
| SwSection & rSection = *pFmt->GetSection(); |
| SwDoc *const pDoc = pFmt->GetDoc(); |
| SwSectionFmts const& rFmts = pDoc->GetSections(); |
| UnoActionContext aContext(pDoc); |
| for (sal_uInt16 i = 0; i < rFmts.Count(); i++) |
| { |
| if (rFmts[i]->GetSection()->GetSectionName() |
| == rSection.GetSectionName()) |
| { |
| pDoc->UpdateSection(i, *pSectionData, pItemSet.get(), |
| pDoc->IsInReading()); |
| { |
| // temporarily remove actions to allow cursor update |
| UnoActionRemoveContext aRemoveContext( pDoc ); |
| } |
| |
| if (bLinkModeChanged) |
| { |
| lcl_UpdateLinkType(rSection, bLinkUpdateAlways); |
| } |
| // section found and processed: break from loop |
| break; |
| } |
| } |
| } |
| } |
| |
| void SwXTextSection::Impl::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(rPropertyNames.getLength() != rValues.getLength()) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| SwSectionFmt *const pFmt = GetSectionFmt(); |
| if (!pFmt && !m_bIsDescriptor) |
| { |
| throw uno::RuntimeException(); |
| } |
| |
| ::std::auto_ptr<SwSectionData> const pSectionData( |
| (pFmt) ? new SwSectionData(*pFmt->GetSection()) : 0); |
| |
| OUString const*const pPropertyNames = rPropertyNames.getConstArray(); |
| uno::Any const*const pValues = rValues.getConstArray(); |
| ::std::auto_ptr<SfxItemSet> pItemSet; |
| sal_Bool bLinkModeChanged = sal_False; |
| sal_Bool bLinkMode = sal_False; |
| |
| for (sal_Int32 nProperty = 0; nProperty < rPropertyNames.getLength(); |
| nProperty++) |
| { |
| SfxItemPropertySimpleEntry const*const pEntry = |
| m_rPropSet.getPropertyMap()->getByName(pPropertyNames[nProperty]); |
| if (!pEntry) |
| { |
| throw beans::UnknownPropertyException( |
| OUString(RTL_CONSTASCII_USTRINGPARAM("Unknown property: ")) |
| + pPropertyNames[nProperty], |
| static_cast<cppu::OWeakObject *>(& m_rThis)); |
| } |
| if (pEntry->nFlags & beans::PropertyAttribute::READONLY) |
| { |
| throw beans::PropertyVetoException( |
| OUString(RTL_CONSTASCII_USTRINGPARAM("Property is read-only: ")) |
| + pPropertyNames[nProperty], |
| static_cast<cppu::OWeakObject *>(& m_rThis)); |
| } |
| switch (pEntry->nWID) |
| { |
| case WID_SECT_CONDITION: |
| { |
| OUString uTmp; |
| pValues[nProperty] >>= uTmp; |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_sCondition = uTmp; |
| } |
| else |
| { |
| pSectionData->SetCondition(uTmp); |
| } |
| } |
| break; |
| case WID_SECT_DDE_TYPE: |
| case WID_SECT_DDE_FILE: |
| case WID_SECT_DDE_ELEMENT: |
| { |
| OUString uTmp; |
| pValues[nProperty] >>= uTmp; |
| String sTmp(uTmp); |
| if (m_bIsDescriptor) |
| { |
| if (!m_pProps->m_bDDE) |
| { |
| ::rtl::OUStringBuffer buf; |
| buf.append(sfx2::cTokenSeperator); |
| buf.append(sfx2::cTokenSeperator); |
| m_pProps->m_sLinkFileName = buf.makeStringAndClear(); |
| m_pProps->m_bDDE = true; |
| } |
| String sLinkFileName(m_pProps->m_sLinkFileName); |
| sLinkFileName.SetToken(pEntry->nWID - WID_SECT_DDE_TYPE, |
| sfx2::cTokenSeperator, sTmp); |
| m_pProps->m_sLinkFileName = sLinkFileName; |
| } |
| else |
| { |
| String sLinkFileName(pSectionData->GetLinkFileName()); |
| if (pSectionData->GetType() != DDE_LINK_SECTION) |
| { |
| sLinkFileName = sfx2::cTokenSeperator; |
| sLinkFileName += sfx2::cTokenSeperator; |
| pSectionData->SetType(DDE_LINK_SECTION); |
| } |
| sLinkFileName.SetToken(pEntry->nWID - WID_SECT_DDE_TYPE, |
| sfx2::cTokenSeperator, sTmp); |
| pSectionData->SetLinkFileName(sLinkFileName); |
| } |
| } |
| break; |
| case WID_SECT_DDE_AUTOUPDATE: |
| { |
| sal_Bool bVal(sal_False); |
| if (!(pValues[nProperty] >>= bVal)) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bUpdateType = bVal; |
| } |
| else |
| { |
| bLinkModeChanged = sal_True; |
| bLinkMode = bVal; |
| } |
| } |
| break; |
| case WID_SECT_LINK: |
| { |
| text::SectionFileLink aLink; |
| if (!(pValues[nProperty] >>= aLink)) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bDDE = sal_False; |
| m_pProps->m_sLinkFileName = aLink.FileURL; |
| m_pProps->m_sSectionFilter = aLink.FilterName; |
| } |
| else |
| { |
| if (pSectionData->GetType() != FILE_LINK_SECTION && |
| aLink.FileURL.getLength()) |
| { |
| pSectionData->SetType(FILE_LINK_SECTION); |
| } |
| ::rtl::OUStringBuffer sFileNameBuf; |
| if (aLink.FileURL.getLength()) |
| { |
| sFileNameBuf.append( URIHelper::SmartRel2Abs( |
| pFmt->GetDoc()->GetDocShell()->GetMedium() |
| ->GetURLObject(), |
| aLink.FileURL, URIHelper::GetMaybeFileHdl())); |
| } |
| sFileNameBuf.append(sfx2::cTokenSeperator); |
| sFileNameBuf.append(aLink.FilterName); |
| sFileNameBuf.append(sfx2::cTokenSeperator); |
| sFileNameBuf.append( |
| pSectionData->GetLinkFileName().GetToken(2, |
| sfx2::cTokenSeperator)); |
| const ::rtl::OUString sFileName( |
| sFileNameBuf.makeStringAndClear()); |
| pSectionData->SetLinkFileName(sFileName); |
| if (sFileName.getLength() < 3) |
| { |
| pSectionData->SetType(CONTENT_SECTION); |
| } |
| } |
| } |
| break; |
| case WID_SECT_REGION: |
| { |
| OUString sLink; |
| pValues[nProperty] >>= sLink; |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bDDE = sal_False; |
| m_pProps->m_sSectionRegion = sLink; |
| } |
| else |
| { |
| if (pSectionData->GetType() != FILE_LINK_SECTION && |
| sLink.getLength()) |
| { |
| pSectionData->SetType(FILE_LINK_SECTION); |
| } |
| String sSectLink(pSectionData->GetLinkFileName()); |
| while (3 < sSectLink.GetTokenCount(sfx2::cTokenSeperator)) |
| { |
| sSectLink += sfx2::cTokenSeperator; |
| } |
| sSectLink.SetToken(2, sfx2::cTokenSeperator, sLink); |
| pSectionData->SetLinkFileName(sSectLink); |
| if (sSectLink.Len() < 3) |
| { |
| pSectionData->SetType(CONTENT_SECTION); |
| } |
| } |
| } |
| break; |
| case WID_SECT_VISIBLE: |
| { |
| sal_Bool bVal(sal_False); |
| if (!(pValues[nProperty] >>= bVal)) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bHidden = !bVal; |
| } |
| else |
| { |
| pSectionData->SetHidden(!bVal); |
| } |
| } |
| break; |
| case WID_SECT_CURRENTLY_VISIBLE: |
| { |
| sal_Bool bVal(sal_False); |
| if (!(pValues[nProperty] >>= bVal)) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bCondHidden = !bVal; |
| } |
| else |
| { |
| if (pSectionData->GetCondition().Len() != 0) |
| { |
| pSectionData->SetCondHidden(!bVal); |
| } |
| } |
| } |
| break; |
| case WID_SECT_PROTECTED: |
| { |
| sal_Bool bVal(sal_False); |
| if (!(pValues[nProperty] >>= bVal)) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bProtect = bVal; |
| } |
| else |
| { |
| pSectionData->SetProtectFlag(bVal); |
| } |
| } |
| break; |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| case WID_SECT_EDIT_IN_READONLY: |
| { |
| sal_Bool bVal(sal_False); |
| if (!(pValues[nProperty] >>= bVal)) |
| { |
| throw lang::IllegalArgumentException(); |
| } |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_bEditInReadonly = bVal; |
| } |
| else |
| { |
| pSectionData->SetEditInReadonlyFlag(bVal); |
| } |
| } |
| // <-- |
| break; |
| case WID_SECT_PASSWORD: |
| { |
| uno::Sequence<sal_Int8> aSeq; |
| pValues[nProperty] >>= aSeq; |
| if (m_bIsDescriptor) |
| { |
| m_pProps->m_Password = aSeq; |
| } |
| else |
| { |
| pSectionData->SetPassword(aSeq); |
| } |
| } |
| break; |
| default: |
| { |
| if (pFmt) |
| { |
| const SfxItemSet& rOldAttrSet = pFmt->GetAttrSet(); |
| pItemSet.reset( new SfxItemSet(*rOldAttrSet.GetPool(), |
| pEntry->nWID, pEntry->nWID, 0)); |
| pItemSet->Put(rOldAttrSet); |
| m_rPropSet.setPropertyValue(*pEntry, |
| pValues[nProperty], *pItemSet); |
| } |
| else |
| { |
| SfxPoolItem* pPutItem = 0; |
| if (RES_COL == pEntry->nWID) |
| { |
| if (!m_pProps->m_pColItem.get()) |
| { |
| m_pProps->m_pColItem.reset(new SwFmtCol); |
| } |
| pPutItem = m_pProps->m_pColItem.get(); |
| } |
| else if (RES_BACKGROUND == pEntry->nWID) |
| { |
| if (!m_pProps->m_pBrushItem.get()) |
| { |
| m_pProps->m_pBrushItem.reset( |
| new SvxBrushItem(RES_BACKGROUND)); |
| } |
| pPutItem = m_pProps->m_pBrushItem.get(); |
| } |
| else if (RES_FTN_AT_TXTEND == pEntry->nWID) |
| { |
| if (!m_pProps->m_pFtnItem.get()) |
| { |
| m_pProps->m_pFtnItem.reset(new SwFmtFtnAtTxtEnd); |
| } |
| pPutItem = m_pProps->m_pFtnItem.get(); |
| } |
| else if (RES_END_AT_TXTEND == pEntry->nWID) |
| { |
| if (!m_pProps->m_pEndItem.get()) |
| { |
| m_pProps->m_pEndItem.reset(new SwFmtEndAtTxtEnd); |
| } |
| pPutItem = m_pProps->m_pEndItem.get(); |
| } |
| else if (RES_UNKNOWNATR_CONTAINER== pEntry->nWID) |
| { |
| if (!m_pProps->m_pXMLAttr.get()) |
| { |
| m_pProps->m_pXMLAttr.reset( |
| new SvXMLAttrContainerItem( |
| RES_UNKNOWNATR_CONTAINER)); |
| } |
| pPutItem = m_pProps->m_pXMLAttr.get(); |
| } |
| else if (RES_COLUMNBALANCE== pEntry->nWID) |
| { |
| if (!m_pProps->m_pNoBalanceItem.get()) |
| { |
| m_pProps->m_pNoBalanceItem.reset( |
| new SwFmtNoBalancedColumns(RES_COLUMNBALANCE)); |
| } |
| pPutItem = m_pProps->m_pNoBalanceItem.get(); |
| } |
| else if (RES_FRAMEDIR == pEntry->nWID) |
| { |
| if (!m_pProps->m_pFrameDirItem.get()) |
| { |
| m_pProps->m_pFrameDirItem.reset( |
| new SvxFrameDirectionItem( |
| FRMDIR_HORI_LEFT_TOP, RES_FRAMEDIR)); |
| } |
| pPutItem = m_pProps->m_pFrameDirItem.get(); |
| } |
| else if (RES_LR_SPACE == pEntry->nWID) |
| { |
| // #109700# |
| if (!m_pProps->m_pLRSpaceItem.get()) |
| { |
| m_pProps->m_pLRSpaceItem.reset( |
| new SvxLRSpaceItem( RES_LR_SPACE )); |
| } |
| pPutItem = m_pProps->m_pLRSpaceItem.get(); |
| } |
| if (pPutItem) |
| { |
| pPutItem->PutValue(pValues[nProperty], |
| pEntry->nMemberId); |
| } |
| } |
| } |
| } |
| } |
| |
| lcl_UpdateSection(pFmt, pSectionData, pItemSet, bLinkModeChanged, |
| bLinkMode); |
| } |
| |
| void SAL_CALL |
| SwXTextSection::setPropertyValues( |
| const uno::Sequence< ::rtl::OUString >& rPropertyNames, |
| const uno::Sequence< uno::Any >& rValues) |
| throw (beans::PropertyVetoException, lang::IllegalArgumentException, |
| lang::WrappedTargetException, uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| // workaround for bad designed API |
| try |
| { |
| m_pImpl->SetPropertyValues_Impl( rPropertyNames, rValues ); |
| } |
| catch (beans::UnknownPropertyException &rException) |
| { |
| // wrap the original (here not allowed) exception in |
| // a WrappedTargetException that gets thrown instead. |
| lang::WrappedTargetException aWExc; |
| aWExc.TargetException <<= rException; |
| throw aWExc; |
| } |
| } |
| /*-- 10.12.98 14:47:11--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SwXTextSection::setPropertyValue( |
| const OUString& rPropertyName, const uno::Any& rValue) |
| throw (beans::UnknownPropertyException, beans::PropertyVetoException, |
| lang::IllegalArgumentException, lang::WrappedTargetException, |
| uno::RuntimeException ) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| uno::Sequence< ::rtl::OUString > aPropertyNames(1); |
| aPropertyNames.getArray()[0] = rPropertyName; |
| uno::Sequence< uno::Any > aValues(1); |
| aValues.getArray()[0] = rValue; |
| m_pImpl->SetPropertyValues_Impl( aPropertyNames, aValues ); |
| } |
| |
| /* -----------------------------12.02.01 10:43-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| uno::Sequence< uno::Any > |
| SwXTextSection::Impl::GetPropertyValues_Impl( |
| const uno::Sequence< OUString > & rPropertyNames ) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| SwSectionFmt *const pFmt = GetSectionFmt(); |
| if (!pFmt && !m_bIsDescriptor) |
| { |
| throw uno::RuntimeException(); |
| } |
| |
| uno::Sequence< uno::Any > aRet(rPropertyNames.getLength()); |
| uno::Any* pRet = aRet.getArray(); |
| SwSection *const pSect = (pFmt) ? pFmt->GetSection() : 0; |
| const OUString* pPropertyNames = rPropertyNames.getConstArray(); |
| |
| for (sal_Int32 nProperty = 0; nProperty < rPropertyNames.getLength(); |
| nProperty++) |
| { |
| SfxItemPropertySimpleEntry const*const pEntry = |
| m_rPropSet.getPropertyMap()->getByName(pPropertyNames[nProperty]); |
| if (!pEntry) |
| { |
| throw beans::UnknownPropertyException( |
| OUString(RTL_CONSTASCII_USTRINGPARAM("Unknown property: ")) |
| + pPropertyNames[nProperty], |
| static_cast<cppu::OWeakObject *>(& m_rThis)); |
| } |
| switch(pEntry->nWID) |
| { |
| case WID_SECT_CONDITION: |
| { |
| OUString uTmp( (m_bIsDescriptor) |
| ? m_pProps->m_sCondition |
| : ::rtl::OUString(pSect->GetCondition())); |
| pRet[nProperty] <<= uTmp; |
| } |
| break; |
| case WID_SECT_DDE_TYPE: |
| case WID_SECT_DDE_FILE: |
| case WID_SECT_DDE_ELEMENT: |
| { |
| ::rtl::OUString sRet; |
| if (m_bIsDescriptor) |
| { |
| if (m_pProps->m_bDDE) |
| { |
| sRet = m_pProps->m_sLinkFileName; |
| } |
| } |
| else if (DDE_LINK_SECTION == pSect->GetType()) |
| { |
| sRet = pSect->GetLinkFileName(); |
| } |
| sal_Int32 nDummy(0); |
| sRet = sRet.getToken(pEntry->nWID - WID_SECT_DDE_TYPE, |
| sfx2::cTokenSeperator, nDummy); |
| pRet[nProperty] <<= sRet; |
| } |
| break; |
| case WID_SECT_DDE_AUTOUPDATE: |
| { |
| // GetUpdateType() returns .._ALWAYS or .._ONCALL |
| if (pSect && pSect->IsLinkType() && pSect->IsConnected()) // lijian i73247 |
| { |
| const sal_Bool bTemp = |
| (pSect->GetUpdateType() == sfx2::LINKUPDATE_ALWAYS); |
| pRet[nProperty] <<= bTemp; |
| } |
| } |
| break; |
| case WID_SECT_LINK : |
| { |
| text::SectionFileLink aLink; |
| if (m_bIsDescriptor) |
| { |
| if (!m_pProps->m_bDDE) |
| { |
| aLink.FileURL = m_pProps->m_sLinkFileName; |
| aLink.FilterName = m_pProps->m_sSectionFilter; |
| } |
| } |
| else if (FILE_LINK_SECTION == pSect->GetType()) |
| { |
| ::rtl::OUString sRet( pSect->GetLinkFileName() ); |
| sal_Int32 nIndex(0); |
| aLink.FileURL = |
| sRet.getToken(0, sfx2::cTokenSeperator, nIndex); |
| aLink.FilterName = |
| sRet.getToken(0, sfx2::cTokenSeperator, nIndex); |
| } |
| pRet[nProperty] <<= aLink; |
| } |
| break; |
| case WID_SECT_REGION : |
| { |
| ::rtl::OUString sRet; |
| if (m_bIsDescriptor) |
| { |
| sRet = m_pProps->m_sSectionRegion; |
| } |
| else if (FILE_LINK_SECTION == pSect->GetType()) |
| { |
| sRet = pSect->GetLinkFileName().GetToken(2, |
| sfx2::cTokenSeperator); |
| } |
| pRet[nProperty] <<= sRet; |
| } |
| break; |
| case WID_SECT_VISIBLE : |
| { |
| const sal_Bool bTemp = (m_bIsDescriptor) |
| ? !m_pProps->m_bHidden : !pSect->IsHidden(); |
| pRet[nProperty] <<= bTemp; |
| } |
| break; |
| case WID_SECT_CURRENTLY_VISIBLE: |
| { |
| const sal_Bool bTemp = (m_bIsDescriptor) |
| ? !m_pProps->m_bCondHidden : !pSect->IsCondHidden(); |
| pRet[nProperty] <<= bTemp; |
| } |
| break; |
| case WID_SECT_PROTECTED: |
| { |
| const sal_Bool bTemp = (m_bIsDescriptor) |
| ? m_pProps->m_bProtect : pSect->IsProtect(); |
| pRet[nProperty] <<= bTemp; |
| } |
| break; |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| case WID_SECT_EDIT_IN_READONLY: |
| { |
| const sal_Bool bTemp = (m_bIsDescriptor) |
| ? m_pProps->m_bEditInReadonly : pSect->IsEditInReadonly(); |
| pRet[nProperty] <<= bTemp; |
| } |
| break; |
| // <-- |
| case FN_PARAM_LINK_DISPLAY_NAME: |
| { |
| if (pFmt) |
| { |
| pRet[nProperty] <<= |
| OUString(pFmt->GetSection()->GetSectionName()); |
| } |
| } |
| break; |
| case WID_SECT_DOCUMENT_INDEX: |
| { |
| // search enclosing index |
| SwSection* pEnclosingSection = pSect; |
| while ((pEnclosingSection != NULL) && |
| (TOX_CONTENT_SECTION != pEnclosingSection->GetType())) |
| { |
| pEnclosingSection = pEnclosingSection->GetParent(); |
| } |
| if (pEnclosingSection) |
| { |
| // convert section to TOXBase and get SwXDocumentIndex |
| SwTOXBaseSection *const pTOXBaseSect = |
| PTR_CAST(SwTOXBaseSection, pEnclosingSection); |
| const uno::Reference<text::XDocumentIndex> xIndex = |
| SwXDocumentIndex::CreateXDocumentIndex( |
| *pTOXBaseSect->GetFmt()->GetDoc(), *pTOXBaseSect); |
| pRet[nProperty] <<= xIndex; |
| } |
| // else: no enclosing index found -> empty return value |
| } |
| break; |
| case WID_SECT_IS_GLOBAL_DOC_SECTION: |
| { |
| const sal_Bool bRet = (NULL == pFmt) ? sal_False : |
| static_cast<sal_Bool>(NULL != pFmt->GetGlobalDocSection()); |
| pRet[nProperty] <<= bRet; |
| } |
| break; |
| case FN_UNO_ANCHOR_TYPES: |
| case FN_UNO_TEXT_WRAP: |
| case FN_UNO_ANCHOR_TYPE: |
| ::sw::GetDefaultTextContentValue( |
| pRet[nProperty], OUString(), pEntry->nWID); |
| break; |
| case FN_UNO_REDLINE_NODE_START: |
| case FN_UNO_REDLINE_NODE_END: |
| { |
| if (!pFmt) |
| break; // lijian i73247 |
| SwNode* pSectNode = pFmt->GetSectionNode(); |
| if (FN_UNO_REDLINE_NODE_END == pEntry->nWID) |
| { |
| pSectNode = pSectNode->EndOfSectionNode(); |
| } |
| const SwRedlineTbl& rRedTbl = |
| pFmt->GetDoc()->GetRedlineTbl(); |
| for (sal_uInt16 nRed = 0; nRed < rRedTbl.Count(); nRed++) |
| { |
| const SwRedline* pRedline = rRedTbl[nRed]; |
| SwNode const*const pRedPointNode = pRedline->GetNode(sal_True); |
| SwNode const*const pRedMarkNode = pRedline->GetNode(sal_False); |
| if ((pRedPointNode == pSectNode) || |
| (pRedMarkNode == pSectNode)) |
| { |
| SwNode const*const pStartOfRedline = |
| (SwNodeIndex(*pRedPointNode) <= |
| SwNodeIndex(*pRedMarkNode)) |
| ? pRedPointNode : pRedMarkNode; |
| const bool bIsStart = (pStartOfRedline == pSectNode); |
| pRet[nProperty] <<= |
| SwXRedlinePortion::CreateRedlineProperties( |
| *pRedline, bIsStart); |
| break; |
| } |
| } |
| } |
| break; |
| case WID_SECT_PASSWORD: |
| { |
| pRet[nProperty] <<= (m_bIsDescriptor) |
| ? m_pProps->m_Password : pSect->GetPassword(); |
| } |
| break; |
| default: |
| { |
| if (pFmt) |
| { |
| m_rPropSet.getPropertyValue(*pEntry, |
| pFmt->GetAttrSet(), pRet[nProperty]); |
| } |
| else |
| { |
| const SfxPoolItem* pQueryItem = 0; |
| if (RES_COL == pEntry->nWID) |
| { |
| if (!m_pProps->m_pColItem.get()) |
| { |
| m_pProps->m_pColItem.reset(new SwFmtCol); |
| } |
| pQueryItem = m_pProps->m_pColItem.get(); |
| } |
| else if (RES_BACKGROUND == pEntry->nWID) |
| { |
| if (!m_pProps->m_pBrushItem.get()) |
| { |
| m_pProps->m_pBrushItem.reset( |
| new SvxBrushItem(RES_BACKGROUND)); |
| } |
| pQueryItem = m_pProps->m_pBrushItem.get(); |
| } |
| else if (RES_FTN_AT_TXTEND == pEntry->nWID) |
| { |
| if (!m_pProps->m_pFtnItem.get()) |
| { |
| m_pProps->m_pFtnItem.reset(new SwFmtFtnAtTxtEnd); |
| } |
| pQueryItem = m_pProps->m_pFtnItem.get(); |
| } |
| else if (RES_END_AT_TXTEND == pEntry->nWID) |
| { |
| if (!m_pProps->m_pEndItem.get()) |
| { |
| m_pProps->m_pEndItem.reset(new SwFmtEndAtTxtEnd); |
| } |
| pQueryItem = m_pProps->m_pEndItem.get(); |
| } |
| else if (RES_UNKNOWNATR_CONTAINER== pEntry->nWID) |
| { |
| if (!m_pProps->m_pXMLAttr.get()) |
| { |
| m_pProps->m_pXMLAttr.reset( |
| new SvXMLAttrContainerItem); |
| } |
| pQueryItem = m_pProps->m_pXMLAttr.get(); |
| } |
| else if (RES_COLUMNBALANCE== pEntry->nWID) |
| { |
| if (!m_pProps->m_pNoBalanceItem.get()) |
| { |
| m_pProps->m_pNoBalanceItem.reset( |
| new SwFmtNoBalancedColumns); |
| } |
| pQueryItem = m_pProps->m_pNoBalanceItem.get(); |
| } |
| else if (RES_FRAMEDIR == pEntry->nWID) |
| { |
| if (!m_pProps->m_pFrameDirItem.get()) |
| { |
| m_pProps->m_pFrameDirItem.reset( |
| new SvxFrameDirectionItem( |
| FRMDIR_ENVIRONMENT, RES_FRAMEDIR)); |
| } |
| pQueryItem = m_pProps->m_pFrameDirItem.get(); |
| } |
| /* -> #109700# */ |
| else if (RES_LR_SPACE == pEntry->nWID) |
| { |
| if (!m_pProps->m_pLRSpaceItem.get()) |
| { |
| m_pProps->m_pLRSpaceItem.reset( |
| new SvxLRSpaceItem( RES_LR_SPACE )); |
| } |
| pQueryItem = m_pProps->m_pLRSpaceItem.get(); |
| } |
| /* <- #109700# */ |
| if (pQueryItem) |
| { |
| pQueryItem->QueryValue(pRet[nProperty], |
| pEntry->nMemberId); |
| } |
| } |
| } |
| } |
| } |
| return aRet; |
| } |
| |
| /* -----------------------------04.11.03 10:43-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| uno::Sequence< uno::Any > SAL_CALL |
| SwXTextSection::getPropertyValues( |
| const uno::Sequence< ::rtl::OUString >& rPropertyNames) |
| throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| uno::Sequence< uno::Any > aValues; |
| |
| // workaround for bad designed API |
| try |
| { |
| aValues = m_pImpl->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; |
| } |
| /*-- 10.12.98 14:47:12--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Any SAL_CALL |
| SwXTextSection::getPropertyValue(const OUString& rPropertyName) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| uno::Sequence< ::rtl::OUString > aPropertyNames(1); |
| aPropertyNames.getArray()[0] = rPropertyName; |
| return m_pImpl->GetPropertyValues_Impl(aPropertyNames).getConstArray()[0]; |
| } |
| /* -----------------------------12.02.01 10:30-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::addPropertiesChangeListener( |
| const uno::Sequence< OUString >& /*aPropertyNames*/, |
| const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ ) |
| throw (uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::addPropertiesChangeListener(): not implemented"); |
| } |
| |
| /* -----------------------------12.02.01 10:30-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::removePropertiesChangeListener( |
| const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ ) |
| throw (uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::removePropertiesChangeListener(): not implemented"); |
| } |
| |
| /* -----------------------------12.02.01 10:30-------------------------------- |
| |
| ---------------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::firePropertiesChangeEvent( |
| const uno::Sequence< OUString >& /*aPropertyNames*/, |
| const uno::Reference< beans::XPropertiesChangeListener >& /*xListener*/ ) |
| throw(uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::firePropertiesChangeEvent(): not implemented"); |
| } |
| |
| /*-- 10.12.98 14:47:13--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SAL_CALL |
| SwXTextSection::addPropertyChangeListener( |
| const ::rtl::OUString& /*rPropertyName*/, |
| const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::addPropertyChangeListener(): not implemented"); |
| } |
| |
| void SAL_CALL |
| SwXTextSection::removePropertyChangeListener( |
| const ::rtl::OUString& /*rPropertyName*/, |
| const uno::Reference< beans::XPropertyChangeListener >& /*xListener*/) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::removePropertyChangeListener(): not implemented"); |
| } |
| |
| void SAL_CALL |
| SwXTextSection::addVetoableChangeListener( |
| const ::rtl::OUString& /*rPropertyName*/, |
| const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::addVetoableChangeListener(): not implemented"); |
| } |
| |
| void SAL_CALL |
| SwXTextSection::removeVetoableChangeListener( |
| const ::rtl::OUString& /*rPropertyName*/, |
| const uno::Reference< beans::XVetoableChangeListener >& /*xListener*/) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| OSL_ENSURE(false, |
| "SwXTextSection::removeVetoableChangeListener(): not implemented"); |
| } |
| |
| /*-- 08.11.00 10:47:55--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| beans::PropertyState SAL_CALL |
| SwXTextSection::getPropertyState(const OUString& rPropertyName) |
| throw (beans::UnknownPropertyException, uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| uno::Sequence< OUString > aNames(1); |
| aNames.getArray()[0] = rPropertyName; |
| return getPropertyStates(aNames).getConstArray()[0]; |
| } |
| /*-- 08.11.00 10:47:55--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Sequence< beans::PropertyState > SAL_CALL |
| SwXTextSection::getPropertyStates( |
| const uno::Sequence< OUString >& rPropertyNames) |
| throw (beans::UnknownPropertyException, uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| SwSectionFmt *const pFmt = m_pImpl->GetSectionFmt(); |
| if (!pFmt && !m_pImpl->m_bIsDescriptor) |
| { |
| throw uno::RuntimeException(); |
| } |
| |
| uno::Sequence< beans::PropertyState > aStates(rPropertyNames.getLength()); |
| beans::PropertyState *const pStates = aStates.getArray(); |
| const OUString* pNames = rPropertyNames.getConstArray(); |
| for (sal_Int32 i = 0; i < rPropertyNames.getLength(); i++) |
| { |
| pStates[i] = beans::PropertyState_DEFAULT_VALUE; |
| SfxItemPropertySimpleEntry const*const pEntry = |
| m_pImpl->m_rPropSet.getPropertyMap()->getByName( pNames[i]); |
| if (!pEntry) |
| { |
| throw beans::UnknownPropertyException( |
| OUString(RTL_CONSTASCII_USTRINGPARAM("Unknown property: ")) |
| + pNames[i], static_cast< cppu::OWeakObject* >(this)); |
| } |
| switch (pEntry->nWID) |
| { |
| case WID_SECT_CONDITION: |
| case WID_SECT_DDE_TYPE: |
| case WID_SECT_DDE_FILE: |
| case WID_SECT_DDE_ELEMENT: |
| case WID_SECT_DDE_AUTOUPDATE: |
| case WID_SECT_LINK: |
| case WID_SECT_REGION : |
| case WID_SECT_VISIBLE: |
| case WID_SECT_PROTECTED: |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| case WID_SECT_EDIT_IN_READONLY: |
| // <-- |
| case FN_PARAM_LINK_DISPLAY_NAME: |
| case FN_UNO_ANCHOR_TYPES: |
| case FN_UNO_TEXT_WRAP: |
| case FN_UNO_ANCHOR_TYPE: |
| pStates[i] = beans::PropertyState_DIRECT_VALUE; |
| break; |
| default: |
| { |
| if (pFmt) |
| { |
| pStates[i] = m_pImpl->m_rPropSet.getPropertyState( |
| pNames[i], pFmt->GetAttrSet()); |
| } |
| else |
| { |
| if (RES_COL == pEntry->nWID) |
| { |
| if (!m_pImpl->m_pProps->m_pColItem.get()) |
| { |
| pStates[i] = beans::PropertyState_DEFAULT_VALUE; |
| } |
| else |
| { |
| pStates[i] = beans::PropertyState_DIRECT_VALUE; |
| } |
| } |
| else //if(RES_BACKGROUND == pEntry->nWID) |
| { |
| if (!m_pImpl->m_pProps->m_pBrushItem.get()) |
| { |
| pStates[i] = beans::PropertyState_DEFAULT_VALUE; |
| } |
| else |
| { |
| pStates[i] = beans::PropertyState_DIRECT_VALUE; |
| } |
| } |
| } |
| } |
| } |
| } |
| return aStates; |
| } |
| |
| /*-- 08.11.00 10:47:55--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SAL_CALL |
| SwXTextSection::setPropertyToDefault(const OUString& rPropertyName) |
| throw (beans::UnknownPropertyException, uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| SwSectionFmt *const pFmt = m_pImpl->GetSectionFmt(); |
| if (!pFmt && !m_pImpl->m_bIsDescriptor) |
| { |
| throw uno::RuntimeException(); |
| } |
| |
| SfxItemPropertySimpleEntry const*const pEntry = |
| m_pImpl->m_rPropSet.getPropertyMap()->getByName(rPropertyName); |
| if (!pEntry) |
| { |
| throw beans::UnknownPropertyException( |
| OUString(RTL_CONSTASCII_USTRINGPARAM("Unknown property: ")) |
| + rPropertyName, static_cast< cppu::OWeakObject* >(this)); |
| } |
| if (pEntry->nFlags & beans::PropertyAttribute::READONLY) |
| { |
| throw uno::RuntimeException(OUString(RTL_CONSTASCII_USTRINGPARAM( |
| "setPropertyToDefault: property is read-only: ")) |
| + rPropertyName, |
| static_cast<cppu::OWeakObject *>(this)); |
| } |
| |
| ::std::auto_ptr<SwSectionData> const pSectionData( |
| (pFmt) ? new SwSectionData(*pFmt->GetSection()) : 0); |
| |
| ::std::auto_ptr<SfxItemSet> pNewAttrSet; |
| bool bLinkModeChanged = false; |
| |
| switch (pEntry->nWID) |
| { |
| case WID_SECT_CONDITION: |
| { |
| if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_pProps->m_sCondition = aEmptyStr; |
| } |
| else |
| { |
| pSectionData->SetCondition(aEmptyStr); |
| } |
| } |
| break; |
| case WID_SECT_DDE_TYPE : |
| case WID_SECT_DDE_FILE : |
| case WID_SECT_DDE_ELEMENT : |
| case WID_SECT_LINK : |
| case WID_SECT_REGION : |
| if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_pProps->m_bDDE = false; |
| m_pImpl->m_pProps->m_sLinkFileName = ::rtl::OUString(); |
| m_pImpl->m_pProps->m_sSectionRegion = ::rtl::OUString(); |
| m_pImpl->m_pProps->m_sSectionFilter = ::rtl::OUString(); |
| } |
| else |
| { |
| pSectionData->SetType(CONTENT_SECTION); |
| } |
| break; |
| case WID_SECT_DDE_AUTOUPDATE: |
| if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_pProps->m_bUpdateType = true; |
| } |
| else |
| { |
| bLinkModeChanged = true; |
| } |
| break; |
| case WID_SECT_VISIBLE : |
| { |
| if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_pProps->m_bHidden = false; |
| } |
| else |
| { |
| pSectionData->SetHidden(false); |
| } |
| } |
| break; |
| case WID_SECT_PROTECTED: |
| { |
| if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_pProps->m_bProtect = false; |
| } |
| else |
| { |
| pSectionData->SetProtectFlag(false); |
| } |
| } |
| break; |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| case WID_SECT_EDIT_IN_READONLY: |
| { |
| if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_pProps->m_bEditInReadonly = false; |
| } |
| else |
| { |
| pSectionData->SetEditInReadonlyFlag(false); |
| } |
| } |
| break; |
| // <-- |
| |
| case FN_UNO_ANCHOR_TYPES: |
| case FN_UNO_TEXT_WRAP: |
| case FN_UNO_ANCHOR_TYPE: |
| break; |
| default: |
| { |
| if (pEntry->nWID <= SFX_WHICH_MAX) |
| { |
| if (pFmt) |
| { |
| const SfxItemSet& rOldAttrSet = pFmt->GetAttrSet(); |
| pNewAttrSet.reset( new SfxItemSet(*rOldAttrSet.GetPool(), |
| pEntry->nWID, pEntry->nWID, 0)); |
| pNewAttrSet->ClearItem(pEntry->nWID); |
| } |
| else |
| { |
| if (RES_COL == pEntry->nWID) |
| { |
| m_pImpl->m_pProps->m_pColItem.reset(); |
| } |
| else if (RES_BACKGROUND == pEntry->nWID) |
| { |
| m_pImpl->m_pProps->m_pBrushItem.reset(); |
| } |
| } |
| } |
| } |
| } |
| |
| lcl_UpdateSection(pFmt, pSectionData, pNewAttrSet, bLinkModeChanged); |
| } |
| |
| /*-- 08.11.00 10:47:56--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| uno::Any SAL_CALL |
| SwXTextSection::getPropertyDefault(const OUString& rPropertyName) |
| throw (beans::UnknownPropertyException, lang::WrappedTargetException, |
| uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| uno::Any aRet; |
| SwSectionFmt *const pFmt = m_pImpl->GetSectionFmt(); |
| SfxItemPropertySimpleEntry const*const pEntry = |
| m_pImpl->m_rPropSet.getPropertyMap()->getByName(rPropertyName); |
| if (!pEntry) |
| { |
| throw beans::UnknownPropertyException( |
| OUString(RTL_CONSTASCII_USTRINGPARAM("Unknown property: ")) |
| + rPropertyName, |
| static_cast<cppu::OWeakObject *>(this)); |
| } |
| |
| switch(pEntry->nWID) |
| { |
| case WID_SECT_CONDITION: |
| case WID_SECT_DDE_TYPE : |
| case WID_SECT_DDE_FILE : |
| case WID_SECT_DDE_ELEMENT : |
| case WID_SECT_REGION : |
| case FN_PARAM_LINK_DISPLAY_NAME: |
| aRet <<= OUString(); |
| break; |
| case WID_SECT_LINK : |
| aRet <<= text::SectionFileLink(); |
| break; |
| case WID_SECT_DDE_AUTOUPDATE: |
| case WID_SECT_VISIBLE : |
| { |
| sal_Bool bTemp = sal_True; |
| aRet.setValue( &bTemp, ::getCppuBooleanType()); |
| } |
| break; |
| case WID_SECT_PROTECTED: |
| // --> FME 2004-06-22 #114856# edit in readonly sections |
| case WID_SECT_EDIT_IN_READONLY: |
| // <-- |
| { |
| sal_Bool bTemp = sal_False; |
| aRet.setValue( &bTemp, ::getCppuBooleanType()); |
| } |
| break; |
| case FN_UNO_ANCHOR_TYPES: |
| case FN_UNO_TEXT_WRAP: |
| case FN_UNO_ANCHOR_TYPE: |
| ::sw::GetDefaultTextContentValue(aRet, OUString(), pEntry->nWID); |
| break; |
| default: |
| if(pFmt && pEntry->nWID <= SFX_WHICH_MAX) |
| { |
| SwDoc *const pDoc = pFmt->GetDoc(); |
| const SfxPoolItem& rDefItem = |
| pDoc->GetAttrPool().GetDefaultItem(pEntry->nWID); |
| rDefItem.QueryValue(aRet, pEntry->nMemberId); |
| } |
| } |
| return aRet; |
| } |
| |
| /*-- 10.12.98 14:47:15--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| OUString SAL_CALL SwXTextSection::getName() throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| ::rtl::OUString sRet; |
| SwSectionFmt const*const pFmt = m_pImpl->GetSectionFmt(); |
| if(pFmt) |
| { |
| sRet = pFmt->GetSection()->GetSectionName(); |
| } |
| else if (m_pImpl->m_bIsDescriptor) |
| { |
| sRet = m_pImpl->m_sName; |
| } |
| else |
| { |
| throw uno::RuntimeException(); |
| } |
| return sRet; |
| } |
| /*-- 10.12.98 14:47:16--------------------------------------------------- |
| |
| -----------------------------------------------------------------------*/ |
| void SAL_CALL SwXTextSection::setName(const OUString& rName) |
| throw (uno::RuntimeException) |
| { |
| vos::OGuard aGuard(Application::GetSolarMutex()); |
| |
| SwSectionFmt *const pFmt = m_pImpl->GetSectionFmt(); |
| if(pFmt) |
| { |
| SwSection *const pSect = pFmt->GetSection(); |
| SwSectionData aSection(*pSect); |
| String sNewName(rName); |
| aSection.SetSectionName(sNewName); |
| |
| const SwSectionFmts& rFmts = pFmt->GetDoc()->GetSections(); |
| sal_uInt16 nApplyPos = USHRT_MAX; |
| for( sal_uInt16 i = 0; i < rFmts.Count(); i++ ) |
| { |
| if(rFmts[i]->GetSection() == pSect) |
| { |
| nApplyPos = i; |
| } |
| else if (sNewName == rFmts[i]->GetSection()->GetSectionName()) |
| { |
| throw uno::RuntimeException(); |
| } |
| } |
| if(nApplyPos != USHRT_MAX) |
| { |
| { |
| UnoActionContext aContext(pFmt->GetDoc()); |
| pFmt->GetDoc()->UpdateSection(nApplyPos, aSection); |
| } |
| { |
| // temporarily remove actions to allow cursor update |
| UnoActionRemoveContext aRemoveContext( pFmt->GetDoc() ); |
| } |
| } |
| } |
| else if (m_pImpl->m_bIsDescriptor) |
| { |
| m_pImpl->m_sName = rName; |
| } |
| else |
| { |
| throw uno::RuntimeException(); |
| } |
| } |
| /* -----------------02.11.99 11:30------------------- |
| |
| --------------------------------------------------*/ |
| OUString SAL_CALL |
| SwXTextSection::getImplementationName() throw (uno::RuntimeException) |
| { |
| return C2U("SwXTextSection"); |
| } |
| |
| /* -----------------02.11.99 11:30------------------- |
| |
| --------------------------------------------------*/ |
| static char const*const g_ServicesTextSection[] = |
| { |
| "com.sun.star.text.TextContent", |
| "com.sun.star.text.TextSection", |
| "com.sun.star.document.LinkTarget", |
| }; |
| static const size_t g_nServicesTextSection( |
| sizeof(g_ServicesTextSection)/sizeof(g_ServicesTextSection[0])); |
| |
| sal_Bool SAL_CALL SwXTextSection::supportsService(const OUString& rServiceName) |
| throw (uno::RuntimeException) |
| { |
| return ::sw::SupportsServiceImpl( |
| g_nServicesTextSection, g_ServicesTextSection, rServiceName); |
| } |
| |
| /* -----------------02.11.99 11:30------------------- |
| |
| --------------------------------------------------*/ |
| uno::Sequence< OUString > SAL_CALL |
| SwXTextSection::getSupportedServiceNames() throw (uno::RuntimeException) |
| { |
| return ::sw::GetSupportedServiceNamesImpl( |
| g_nServicesTextSection, g_ServicesTextSection); |
| } |
| |
| |
| // MetadatableMixin |
| ::sfx2::Metadatable* SwXTextSection::GetCoreObject() |
| { |
| SwSectionFmt *const pSectionFmt( m_pImpl->GetSectionFmt() ); |
| return pSectionFmt; |
| } |
| |
| uno::Reference<frame::XModel> SwXTextSection::GetModel() |
| { |
| SwSectionFmt *const pSectionFmt( m_pImpl->GetSectionFmt() ); |
| if (pSectionFmt) |
| { |
| SwDocShell const*const pShell( pSectionFmt->GetDoc()->GetDocShell() ); |
| return (pShell) ? pShell->GetModel() : 0; |
| } |
| return 0; |
| } |
| |