| /************************************************************** |
| * |
| * 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 <hintids.hxx> |
| #include <com/sun/star/text/RelOrientation.hpp> |
| #include <com/sun/star/text/VertOrientation.hpp> |
| #include <com/sun/star/text/HorizontalAdjust.hpp> |
| #include <com/sun/star/text/DocumentStatistic.hpp> |
| #include <com/sun/star/text/HoriOrientation.hpp> |
| #include <com/sun/star/text/HoriOrientationFormat.hpp> |
| #include <com/sun/star/text/NotePrintMode.hpp> |
| #include <com/sun/star/text/SizeType.hpp> |
| #include <com/sun/star/text/VertOrientationFormat.hpp> |
| #include <com/sun/star/text/WrapTextMode.hpp> |
| #include <com/sun/star/text/XTextFrame.hpp> |
| #include <com/sun/star/text/TextContentAnchorType.hpp> |
| #include <com/sun/star/text/InvalidTextContentException.hpp> |
| #include <com/sun/star/container/XIndexContainer.hpp> |
| #include <com/sun/star/text/TextGridMode.hpp> |
| #include <com/sun/star/awt/Size.hpp> |
| #include <svtools/unoimap.hxx> |
| #include <svtools/unoevent.hxx> |
| #include <basic/sbxvar.hxx> |
| #include <svtools/imap.hxx> |
| #include <svtools/imapobj.hxx> |
| #include <editeng/ulspitem.hxx> |
| #include <editeng/lrspitem.hxx> |
| #include <svx/svdmodel.hxx> |
| #include <svx/svdpage.hxx> |
| #include <unosett.hxx> |
| #include <unostyle.hxx> |
| #include <fmtclds.hxx> |
| #include <fmtornt.hxx> |
| #include <fmthdft.hxx> |
| #include <fmtpdsc.hxx> |
| #include <fmtcntnt.hxx> |
| #include <fmtfsize.hxx> |
| #include <fmtfordr.hxx> |
| #include <fmtsrnd.hxx> |
| #include <fmtanchr.hxx> |
| #include <fmtlsplt.hxx> |
| #include <fmtrowsplt.hxx> |
| #include <fmtftntx.hxx> |
| #include <fmteiro.hxx> |
| #include <fmturl.hxx> |
| #include <fmtcnct.hxx> |
| #include <node.hxx> |
| #include <section.hxx> |
| #include <fmtline.hxx> |
| #include <tgrditem.hxx> |
| #include <hfspacingitem.hxx> |
| #include <doc.hxx> |
| #include <IDocumentUndoRedo.hxx> |
| #include <pagefrm.hxx> |
| #include <rootfrm.hxx> |
| #include <cntfrm.hxx> |
| #include <crsrsh.hxx> |
| #include <pam.hxx> |
| #include <dflyobj.hxx> |
| #include <dcontact.hxx> |
| #include <flyfrm.hxx> |
| #include <frmtool.hxx> |
| #include <flyfrms.hxx> |
| #include <pagedesc.hxx> |
| #include <grfatr.hxx> |
| #include <ndnotxt.hxx> |
| #include <docary.hxx> |
| #include <node2lay.hxx> |
| #include <fmtclbl.hxx> |
| #include <swunohelper.hxx> |
| #include <unoframe.hxx> |
| #include <unotextbodyhf.hxx> |
| #include <SwStyleNameMapper.hxx> |
| #include <editeng/brshitem.hxx> |
| #include <svtools/grfmgr.hxx> |
| #include <cmdid.h> |
| #include <unomid.h> |
| #include <comcore.hrc> |
| #include <svx/svdundo.hxx> // #111827# |
| #include <sortedobjs.hxx> |
| #include <HandleAnchorNodeChg.hxx> |
| #include <svl/cjkoptions.hxx> |
| #include <switerator.hxx> |
| #include <pagedeschint.hxx> |
| |
| using namespace ::com::sun::star; |
| using ::rtl::OUString; |
| |
| SV_IMPL_PTRARR(SwColumns,SwColumn*) |
| |
| TYPEINIT1(SwFmtVertOrient, SfxPoolItem); |
| TYPEINIT1(SwFmtHoriOrient, SfxPoolItem); |
| TYPEINIT2(SwFmtHeader, SfxPoolItem, SwClient ); |
| TYPEINIT2(SwFmtFooter, SfxPoolItem, SwClient ); |
| TYPEINIT2(SwFmtPageDesc, SfxPoolItem, SwClient ); |
| TYPEINIT1_AUTOFACTORY(SwFmtLineNumber, SfxPoolItem); |
| |
| /* -----------------19.05.98 09:26------------------- |
| * Umwandlung fuer QueryValue |
| * --------------------------------------------------*/ |
| sal_Int16 lcl_RelToINT(sal_Int16 eRelation) |
| { |
| sal_Int16 nRet = text::RelOrientation::FRAME; |
| switch(eRelation) |
| { |
| case text::RelOrientation::PRINT_AREA: nRet = text::RelOrientation::PRINT_AREA; break; |
| case text::RelOrientation::CHAR: nRet = text::RelOrientation::CHAR; break; |
| case text::RelOrientation::PAGE_LEFT: nRet = text::RelOrientation::PAGE_LEFT; break; |
| case text::RelOrientation::PAGE_RIGHT: nRet = text::RelOrientation::PAGE_RIGHT; break; |
| case text::RelOrientation::FRAME_LEFT: nRet = text::RelOrientation::FRAME_LEFT; break; |
| case text::RelOrientation::FRAME_RIGHT: nRet = text::RelOrientation::FRAME_RIGHT; break; |
| case text::RelOrientation::PAGE_FRAME: nRet = text::RelOrientation::PAGE_FRAME; break; |
| case text::RelOrientation::PAGE_PRINT_AREA: nRet = text::RelOrientation::PAGE_PRINT_AREA; break; |
| // OD 13.11.2003 #i22341# |
| case text::RelOrientation::TEXT_LINE: nRet = text::RelOrientation::TEXT_LINE; break; |
| default: break; |
| } |
| return nRet; |
| } |
| |
| sal_Int16 lcl_IntToRelation(const uno::Any& rVal) |
| { |
| sal_Int16 eRet = text::RelOrientation::FRAME; |
| sal_Int16 nVal = 0; |
| rVal >>= nVal; |
| switch(nVal) |
| { |
| case text::RelOrientation::PRINT_AREA: eRet = text::RelOrientation::PRINT_AREA ; break; |
| case text::RelOrientation::CHAR: eRet = text::RelOrientation::CHAR ; break; |
| case text::RelOrientation::PAGE_LEFT: eRet = text::RelOrientation::PAGE_LEFT ; break; |
| case text::RelOrientation::PAGE_RIGHT: eRet = text::RelOrientation::PAGE_RIGHT ; break; |
| case text::RelOrientation::FRAME_LEFT: eRet = text::RelOrientation::FRAME_LEFT ; break; |
| case text::RelOrientation::FRAME_RIGHT: eRet = text::RelOrientation::FRAME_RIGHT ; break; |
| case text::RelOrientation::PAGE_FRAME: eRet = text::RelOrientation::PAGE_FRAME ; break; |
| case text::RelOrientation::PAGE_PRINT_AREA: eRet = text::RelOrientation::PAGE_PRINT_AREA ; break; |
| // OD 13.11.2003 #i22341# |
| case text::RelOrientation::TEXT_LINE: eRet = text::RelOrientation::TEXT_LINE; break; |
| } |
| return eRet; |
| } |
| |
| void DelHFFormat( SwClient *pToRemove, SwFrmFmt *pFmt ) |
| { |
| //Wenn der Client der letzte ist der das Format benutzt, so muss dieses |
| //vernichtet werden. Zuvor muss jedoch ggf. die Inhaltssection vernichtet |
| //werden. |
| SwDoc* pDoc = pFmt->GetDoc(); |
| pFmt->Remove( pToRemove ); |
| if( pDoc->IsInDtor() ) |
| { |
| delete pFmt; |
| return; |
| } |
| |
| //Nur noch Frms angemeldet? |
| sal_Bool bDel = sal_True; |
| { |
| // Klammer, weil im DTOR SwClientIter das Flag bTreeChg zurueck |
| // gesetzt wird. Unguenstig, wenn das Format vorher zerstoert wird. |
| SwClientIter aIter( *pFmt ); // TODO |
| SwClient *pLast = aIter.GoStart(); |
| if( pLast ) |
| do { |
| bDel = pLast->IsA( TYPE(SwFrm) ) |
| || SwXHeadFootText::IsXHeadFootText(pLast); |
| } while( bDel && 0 != ( pLast = ++aIter )); |
| } |
| |
| if ( bDel ) |
| { |
| //Wenn in einem der Nodes noch ein Crsr angemeldet ist, muss das |
| //ParkCrsr einer (beliebigen) Shell gerufen werden. |
| SwFmtCntnt& rCnt = (SwFmtCntnt&)pFmt->GetCntnt(); |
| if ( rCnt.GetCntntIdx() ) |
| { |
| SwNode *pNode = 0; |
| { |
| // --> OD 2008-10-07 #i92993# |
| // Begin with start node of page header/footer to assure that |
| // complete content is checked for cursors and the complete content |
| // is deleted on below made method call <pDoc->DeleteSection(pNode)> |
| // SwNodeIndex aIdx( *rCnt.GetCntntIdx(), 1 ); |
| SwNodeIndex aIdx( *rCnt.GetCntntIdx(), 0 ); |
| // <-- |
| //Wenn in einem der Nodes noch ein Crsr angemeldet ist, muss das |
| //ParkCrsr einer (beliebigen) Shell gerufen werden. |
| pNode = & aIdx.GetNode(); |
| sal_uInt32 nEnd = pNode->EndOfSectionIndex(); |
| while ( aIdx < nEnd ) |
| { |
| if ( pNode->IsCntntNode() && |
| ((SwCntntNode*)pNode)->GetDepends() ) |
| { |
| SwCrsrShell *pShell = SwIterator<SwCrsrShell,SwCntntNode>::FirstElement( *(SwCntntNode*)pNode ); |
| if( pShell ) |
| { |
| pShell->ParkCrsr( aIdx ); |
| aIdx = nEnd-1; |
| } |
| } |
| aIdx++; |
| pNode = & aIdx.GetNode(); |
| } |
| } |
| rCnt.SetNewCntntIdx( (const SwNodeIndex*)0 ); |
| |
| // beim Loeschen von Header/Footer-Formaten IMMER das Undo |
| // abschalten! (Bug 31069) |
| ::sw::UndoGuard const undoGuard(pDoc->GetIDocumentUndoRedo()); |
| |
| ASSERT( pNode, "Ein grosses Problem." ); |
| pDoc->DeleteSection( pNode ); |
| } |
| delete pFmt; |
| } |
| } |
| |
| // class SwFmtFrmSize |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtFrmSize::SwFmtFrmSize( SwFrmSize eSize, SwTwips nWidth, SwTwips nHeight ) |
| : SfxPoolItem( RES_FRM_SIZE ), |
| aSize( nWidth, nHeight ), |
| eFrmHeightType( eSize ), |
| eFrmWidthType( ATT_FIX_SIZE ) |
| { |
| nWidthPercent = nHeightPercent = 0; |
| } |
| |
| SwFmtFrmSize& SwFmtFrmSize::operator=( const SwFmtFrmSize& rCpy ) |
| { |
| aSize = rCpy.GetSize(); |
| eFrmHeightType = rCpy.GetHeightSizeType(); |
| eFrmWidthType = rCpy.GetWidthSizeType(); |
| nHeightPercent = rCpy.GetHeightPercent(); |
| nWidthPercent = rCpy.GetWidthPercent(); |
| return *this; |
| } |
| |
| int SwFmtFrmSize::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return( eFrmHeightType == ((SwFmtFrmSize&)rAttr).eFrmHeightType && |
| eFrmWidthType == ((SwFmtFrmSize&)rAttr).eFrmWidthType && |
| aSize == ((SwFmtFrmSize&)rAttr).GetSize()&& |
| nWidthPercent == ((SwFmtFrmSize&)rAttr).GetWidthPercent() && |
| nHeightPercent == ((SwFmtFrmSize&)rAttr).GetHeightPercent() ); |
| } |
| |
| SfxPoolItem* SwFmtFrmSize::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtFrmSize( *this ); |
| } |
| |
| |
| /* -----------------24.04.98 11:36------------------- |
| * |
| * --------------------------------------------------*/ |
| sal_Bool SwFmtFrmSize::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| switch ( nMemberId ) |
| { |
| case MID_FRMSIZE_SIZE: |
| { |
| awt::Size aTmp; |
| aTmp.Height = TWIP_TO_MM100(aSize.Height()); |
| aTmp.Width = TWIP_TO_MM100(aSize.Width()); |
| rVal.setValue(&aTmp, ::getCppuType((const awt::Size*)0)); |
| } |
| break; |
| case MID_FRMSIZE_REL_HEIGHT: |
| rVal <<= (sal_Int16)(GetHeightPercent() != 0xFF ? GetHeightPercent() : 0); |
| break; |
| case MID_FRMSIZE_REL_WIDTH: |
| rVal <<= (sal_Int16)(GetWidthPercent() != 0xFF ? GetWidthPercent() : 0); |
| break; |
| case MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH: |
| { |
| sal_Bool bTmp = 0xFF == GetHeightPercent(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT: |
| { |
| sal_Bool bTmp = 0xFF == GetWidthPercent(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_FRMSIZE_WIDTH : |
| rVal <<= (sal_Int32)TWIP_TO_MM100(aSize.Width()); |
| break; |
| case MID_FRMSIZE_HEIGHT: |
| // #95848# returned size should never be zero. |
| // (there was a bug that allowed for setting height to 0. |
| // Thus there some documents existing with that not allowed |
| // attribut value which may cause problems on import.) |
| rVal <<= (sal_Int32)TWIP_TO_MM100(aSize.Height() < MINLAY ? MINLAY : aSize.Height() ); |
| break; |
| case MID_FRMSIZE_SIZE_TYPE: |
| rVal <<= (sal_Int16)GetHeightSizeType(); |
| break; |
| case MID_FRMSIZE_IS_AUTO_HEIGHT: |
| { |
| sal_Bool bTmp = ATT_FIX_SIZE != GetHeightSizeType(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_FRMSIZE_WIDTH_TYPE: |
| rVal <<= (sal_Int16)GetWidthSizeType(); |
| break; |
| } |
| return sal_True; |
| } |
| |
| /* -----------------24.04.98 11:36------------------- |
| * |
| * --------------------------------------------------*/ |
| sal_Bool SwFmtFrmSize::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| sal_Bool bConvert = 0 != (nMemberId&CONVERT_TWIPS); |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_FRMSIZE_SIZE: |
| { |
| awt::Size aVal; |
| if(!(rVal >>= aVal)) |
| bRet = sal_False; |
| else |
| { |
| Size aTmp(aVal.Width, aVal.Height); |
| if(bConvert) |
| { |
| aTmp.Height() = MM100_TO_TWIP(aTmp.Height()); |
| aTmp.Width() = MM100_TO_TWIP(aTmp.Width()); |
| } |
| if(aTmp.Height() && aTmp.Width()) |
| aSize = aTmp; |
| else |
| bRet = sal_False; |
| } |
| } |
| break; |
| case MID_FRMSIZE_REL_HEIGHT: |
| { |
| sal_Int16 nSet = 0; |
| rVal >>= nSet; |
| if(nSet >= 0 && nSet <= 0xfe) |
| SetHeightPercent((sal_uInt8)nSet); |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_FRMSIZE_REL_WIDTH: |
| { |
| sal_Int16 nSet = 0; |
| rVal >>= nSet; |
| if(nSet >= 0 && nSet <= 0xfe) |
| SetWidthPercent((sal_uInt8)nSet); |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_FRMSIZE_IS_SYNC_HEIGHT_TO_WIDTH: |
| { |
| sal_Bool bSet = *(sal_Bool*)rVal.getValue(); |
| if(bSet) |
| SetHeightPercent(0xff); |
| else if( 0xff == GetHeightPercent() ) |
| SetHeightPercent( 0 ); |
| } |
| break; |
| case MID_FRMSIZE_IS_SYNC_WIDTH_TO_HEIGHT: |
| { |
| sal_Bool bSet = *(sal_Bool*)rVal.getValue(); |
| if(bSet) |
| SetWidthPercent(0xff); |
| else if( 0xff == GetWidthPercent() ) |
| SetWidthPercent(0); |
| } |
| break; |
| case MID_FRMSIZE_WIDTH : |
| { |
| sal_Int32 nWd = 0; |
| if(rVal >>= nWd) |
| { |
| if(bConvert) |
| nWd = MM100_TO_TWIP(nWd); |
| if(nWd < MINLAY) |
| nWd = MINLAY; |
| aSize.Width() = nWd; |
| } |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_FRMSIZE_HEIGHT: |
| { |
| sal_Int32 nHg = 0; |
| if(rVal >>= nHg) |
| { |
| if(bConvert) |
| nHg = MM100_TO_TWIP(nHg); |
| if(nHg < MINLAY) |
| nHg = MINLAY; |
| aSize.Height() = nHg; |
| } |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_FRMSIZE_SIZE_TYPE: |
| { |
| sal_Int16 nType = 0; |
| if((rVal >>= nType) && nType >= 0 && nType <= ATT_MIN_SIZE ) |
| { |
| SetHeightSizeType((SwFrmSize)nType); |
| } |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_FRMSIZE_IS_AUTO_HEIGHT: |
| { |
| sal_Bool bSet = *(sal_Bool*)rVal.getValue(); |
| SetHeightSizeType(bSet ? ATT_VAR_SIZE : ATT_FIX_SIZE); |
| } |
| break; |
| case MID_FRMSIZE_WIDTH_TYPE: |
| { |
| sal_Int16 nType = 0; |
| if((rVal >>= nType) && nType >= 0 && nType <= ATT_MIN_SIZE ) |
| { |
| SetWidthSizeType((SwFrmSize)nType); |
| } |
| else |
| bRet = sal_False; |
| } |
| break; |
| default: |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| // class SwFmtFillOrder |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtFillOrder::SwFmtFillOrder( SwFillOrder nFO ) |
| : SfxEnumItem( RES_FILL_ORDER, sal_uInt16(nFO) ) |
| {} |
| |
| SfxPoolItem* SwFmtFillOrder::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtFillOrder( GetFillOrder() ); |
| } |
| |
| sal_uInt16 SwFmtFillOrder::GetValueCount() const |
| { |
| return SW_FILL_ORDER_END - SW_FILL_ORDER_BEGIN; |
| } |
| |
| // class SwFmtHeader |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtHeader::SwFmtHeader( SwFrmFmt *pHeaderFmt ) |
| : SfxPoolItem( RES_HEADER ), |
| SwClient( pHeaderFmt ), |
| bActive( pHeaderFmt ? sal_True : sal_False ) |
| { |
| } |
| |
| SwFmtHeader::SwFmtHeader( const SwFmtHeader &rCpy ) |
| : SfxPoolItem( RES_HEADER ), |
| SwClient( (SwModify*)rCpy.GetRegisteredIn() ), |
| bActive( rCpy.IsActive() ) |
| { |
| } |
| |
| SwFmtHeader::SwFmtHeader( sal_Bool bOn ) |
| : SfxPoolItem( RES_HEADER ), |
| SwClient( 0 ), |
| bActive( bOn ) |
| { |
| } |
| |
| SwFmtHeader::~SwFmtHeader() |
| { |
| if ( GetHeaderFmt() ) |
| DelHFFormat( this, GetHeaderFmt() ); |
| } |
| |
| int SwFmtHeader::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return ( GetRegisteredIn() == ((SwFmtHeader&)rAttr).GetRegisteredIn() && |
| bActive == ((SwFmtHeader&)rAttr).IsActive() ); |
| } |
| |
| SfxPoolItem* SwFmtHeader::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtHeader( *this ); |
| } |
| |
| void SwFmtHeader::RegisterToFormat( SwFmt& rFmt ) |
| { |
| rFmt.Add(this); |
| } |
| |
| // class SwFmtFooter |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtFooter::SwFmtFooter( SwFrmFmt *pFooterFmt ) |
| : SfxPoolItem( RES_FOOTER ), |
| SwClient( pFooterFmt ), |
| bActive( pFooterFmt ? sal_True : sal_False ) |
| { |
| } |
| |
| SwFmtFooter::SwFmtFooter( const SwFmtFooter &rCpy ) |
| : SfxPoolItem( RES_FOOTER ), |
| SwClient( (SwModify*)rCpy.GetRegisteredIn() ), |
| bActive( rCpy.IsActive() ) |
| { |
| } |
| |
| SwFmtFooter::SwFmtFooter( sal_Bool bOn ) |
| : SfxPoolItem( RES_FOOTER ), |
| SwClient( 0 ), |
| bActive( bOn ) |
| { |
| } |
| |
| SwFmtFooter::~SwFmtFooter() |
| { |
| if ( GetFooterFmt() ) |
| DelHFFormat( this, GetFooterFmt() ); |
| } |
| |
| void SwFmtFooter::RegisterToFormat( SwFmt& rFmt ) |
| { |
| rFmt.Add(this); |
| } |
| |
| int SwFmtFooter::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return ( GetRegisteredIn() == ((SwFmtFooter&)rAttr).GetRegisteredIn() && |
| bActive == ((SwFmtFooter&)rAttr).IsActive() ); |
| } |
| |
| SfxPoolItem* SwFmtFooter::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtFooter( *this ); |
| } |
| |
| // class SwFmtCntnt |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtCntnt::SwFmtCntnt( const SwFmtCntnt &rCpy ) |
| : SfxPoolItem( RES_CNTNT ) |
| { |
| pStartNode = rCpy.GetCntntIdx() ? |
| new SwNodeIndex( *rCpy.GetCntntIdx() ) : 0; |
| } |
| |
| SwFmtCntnt::SwFmtCntnt( const SwStartNode *pStartNd ) |
| : SfxPoolItem( RES_CNTNT ) |
| { |
| pStartNode = pStartNd ? new SwNodeIndex( *pStartNd ) : 0; |
| } |
| |
| SwFmtCntnt::~SwFmtCntnt() |
| { |
| delete pStartNode; |
| } |
| |
| void SwFmtCntnt::SetNewCntntIdx( const SwNodeIndex *pIdx ) |
| { |
| delete pStartNode; |
| pStartNode = pIdx ? new SwNodeIndex( *pIdx ) : 0; |
| } |
| |
| int SwFmtCntnt::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| if( (long)pStartNode ^ (long)((SwFmtCntnt&)rAttr).pStartNode ) |
| return 0; |
| if( pStartNode ) |
| return ( *pStartNode == *((SwFmtCntnt&)rAttr).GetCntntIdx() ); |
| return 1; |
| } |
| |
| SfxPoolItem* SwFmtCntnt::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtCntnt( *this ); |
| } |
| |
| // class SwFmtPageDesc |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtPageDesc::SwFmtPageDesc( const SwFmtPageDesc &rCpy ) |
| : SfxPoolItem( RES_PAGEDESC ), |
| SwClient( (SwPageDesc*)rCpy.GetPageDesc() ), |
| nNumOffset( rCpy.nNumOffset ), |
| nDescNameIdx( rCpy.nDescNameIdx ), |
| pDefinedIn( 0 ) |
| { |
| } |
| |
| SwFmtPageDesc::SwFmtPageDesc( const SwPageDesc *pDesc ) |
| : SfxPoolItem( RES_PAGEDESC ), |
| SwClient( (SwPageDesc*)pDesc ), |
| nNumOffset( 0 ), |
| nDescNameIdx( 0xFFFF ), // IDX_NO_VALUE |
| pDefinedIn( 0 ) |
| { |
| } |
| |
| SwFmtPageDesc::~SwFmtPageDesc() {} |
| |
| bool SwFmtPageDesc::KnowsPageDesc() const |
| { |
| return (GetRegisteredIn() != 0); |
| } |
| |
| int SwFmtPageDesc::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return ( pDefinedIn == ((SwFmtPageDesc&)rAttr).pDefinedIn ) && |
| ( nNumOffset == ((SwFmtPageDesc&)rAttr).nNumOffset ) && |
| ( GetPageDesc() == ((SwFmtPageDesc&)rAttr).GetPageDesc() ); |
| } |
| |
| SfxPoolItem* SwFmtPageDesc::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtPageDesc( *this ); |
| } |
| |
| void SwFmtPageDesc::SwClientNotify( const SwModify&, const SfxHint& rHint ) |
| { |
| const SwPageDescHint* pHint = dynamic_cast<const SwPageDescHint*>(&rHint); |
| if ( pHint ) |
| { |
| // mba: shouldn't that be broadcasted also? |
| SwFmtPageDesc aDfltDesc( pHint->GetPageDesc() ); |
| SwPageDesc* pDesc = pHint->GetPageDesc(); |
| const SwModify* pMod = GetDefinedIn(); |
| if ( pMod ) |
| { |
| if( pMod->ISA( SwCntntNode ) ) |
| ((SwCntntNode*)pMod)->SetAttr( aDfltDesc ); |
| else if( pMod->ISA( SwFmt )) |
| ((SwFmt*)pMod)->SetFmtAttr( aDfltDesc ); |
| else |
| { |
| DBG_ERROR( "What kind of SwModify is this?" ); |
| RegisterToPageDesc( *pDesc ); |
| } |
| } |
| else |
| // there could be an Undo-copy |
| RegisterToPageDesc( *pDesc ); |
| } |
| } |
| |
| void SwFmtPageDesc::RegisterToPageDesc( SwPageDesc& rDesc ) |
| { |
| rDesc.Add( this ); |
| } |
| |
| void SwFmtPageDesc::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) |
| { |
| if( !pDefinedIn ) |
| return; |
| |
| const sal_uInt16 nWhichId = pOld ? pOld->Which() : pNew ? pNew->Which() : 0; |
| switch( nWhichId ) |
| { |
| case RES_OBJECTDYING: |
| //Der Pagedesc, bei dem ich angemeldet bin stirbt, ich trage |
| //mich also bei meinem Format aus. |
| //Dabei werden ich Deletet!!! |
| if( IS_TYPE( SwFmt, pDefinedIn )) |
| #ifdef DBG_UTIL |
| { |
| sal_Bool bDel = ((SwFmt*)pDefinedIn)->ResetFmtAttr( RES_PAGEDESC ); |
| ASSERT( bDel, ";-) FmtPageDesc nicht zerstoert." ); |
| } |
| #else |
| ((SwFmt*)pDefinedIn)->ResetFmtAttr( RES_PAGEDESC ); |
| #endif |
| else if( IS_TYPE( SwCntntNode, pDefinedIn )) |
| #ifdef DBG_UTIL |
| { |
| sal_Bool bDel = ((SwCntntNode*)pDefinedIn)->ResetAttr( RES_PAGEDESC ); |
| ASSERT( bDel, ";-) FmtPageDesc nicht zerstoert." ); |
| } |
| #else |
| ((SwCntntNode*)pDefinedIn)->ResetAttr( RES_PAGEDESC ); |
| #endif |
| break; |
| |
| default: |
| /* do nothing */; |
| } |
| } |
| |
| sal_Bool SwFmtPageDesc::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_PAGEDESC_PAGENUMOFFSET: |
| rVal <<= (sal_Int16)GetNumOffset(); |
| break; |
| |
| case MID_PAGEDESC_PAGEDESCNAME: |
| { |
| const SwPageDesc* pDesc = GetPageDesc(); |
| if( pDesc ) |
| { |
| String aString; |
| SwStyleNameMapper::FillProgName(pDesc->GetName(), aString, nsSwGetPoolIdFromName::GET_POOLID_PAGEDESC, sal_True ); |
| rVal <<= OUString( aString ); |
| } |
| else |
| rVal.clear(); |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtPageDesc::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_PAGEDESC_PAGENUMOFFSET: |
| { |
| sal_Int16 nOffset = 0; |
| if(rVal >>= nOffset) |
| SetNumOffset( nOffset ); |
| else |
| bRet = sal_False; |
| } |
| break; |
| |
| case MID_PAGEDESC_PAGEDESCNAME: |
| /* geht nicht, weil das Attribut eigentlich nicht den Namen |
| * sondern einen Pointer auf den PageDesc braucht (ist Client davon). |
| * Der Pointer waere aber ueber den Namen nur vom Dokument zu erfragen. |
| */ |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| |
| // class SwFmtCol |
| // Implementierung teilweise inline im hxx |
| |
| SwColumn::SwColumn() : |
| nWish ( 0 ), |
| nUpper( 0 ), |
| nLower( 0 ), |
| nLeft ( 0 ), |
| nRight( 0 ) |
| { |
| } |
| |
| sal_Bool SwColumn::operator==( const SwColumn &rCmp ) |
| { |
| return (nWish == rCmp.GetWishWidth() && |
| GetLeft() == rCmp.GetLeft() && |
| GetRight() == rCmp.GetRight() && |
| GetUpper() == rCmp.GetUpper() && |
| GetLower() == rCmp.GetLower()) ? sal_True : sal_False; |
| } |
| |
| SwFmtCol::SwFmtCol( const SwFmtCol& rCpy ) |
| : SfxPoolItem( RES_COL ), |
| nLineWidth( rCpy.nLineWidth), |
| aLineColor( rCpy.aLineColor), |
| nLineHeight( rCpy.GetLineHeight() ), |
| eAdj( rCpy.GetLineAdj() ), |
| aColumns( (sal_Int8)rCpy.GetNumCols(), 1 ), |
| nWidth( rCpy.GetWishWidth() ), |
| aWidthAdjustValue( rCpy.aWidthAdjustValue ), |
| bOrtho( rCpy.IsOrtho() ) |
| { |
| for ( sal_uInt16 i = 0; i < rCpy.GetNumCols(); ++i ) |
| { |
| SwColumn *pCol = new SwColumn( *rCpy.GetColumns()[i] ); |
| aColumns.Insert( pCol, aColumns.Count() ); |
| } |
| } |
| |
| SwFmtCol::~SwFmtCol() {} |
| |
| SwFmtCol& SwFmtCol::operator=( const SwFmtCol& rCpy ) |
| { |
| nLineWidth = rCpy.nLineWidth; |
| aLineColor = rCpy.aLineColor; |
| nLineHeight = rCpy.GetLineHeight(); |
| eAdj = rCpy.GetLineAdj(); |
| nWidth = rCpy.GetWishWidth(); |
| bOrtho = rCpy.IsOrtho(); |
| aWidthAdjustValue = rCpy.aWidthAdjustValue; |
| |
| if ( aColumns.Count() ) |
| aColumns.DeleteAndDestroy( 0, aColumns.Count() ); |
| for ( sal_uInt16 i = 0; i < rCpy.GetNumCols(); ++i ) |
| { |
| SwColumn *pCol = new SwColumn( *rCpy.GetColumns()[i] ); |
| aColumns.Insert( pCol, aColumns.Count() ); |
| } |
| return *this; |
| } |
| |
| SwFmtCol::SwFmtCol() |
| : SfxPoolItem( RES_COL ), |
| nLineWidth(0), |
| nLineHeight( 100 ), |
| eAdj( COLADJ_NONE ), |
| nWidth( USHRT_MAX ), |
| aWidthAdjustValue( 0 ), |
| bOrtho( sal_True ) |
| { |
| } |
| |
| int SwFmtCol::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| const SwFmtCol &rCmp = (const SwFmtCol&)rAttr; |
| if( !(nLineWidth == rCmp.nLineWidth && |
| aLineColor == rCmp.aLineColor && |
| nLineHeight == rCmp.GetLineHeight() && |
| eAdj == rCmp.GetLineAdj() && |
| nWidth == rCmp.GetWishWidth() && |
| bOrtho == rCmp.IsOrtho() && |
| aColumns.Count() == rCmp.GetNumCols() && |
| aWidthAdjustValue == rCmp.GetAdjustValue() |
| ) ) |
| return 0; |
| |
| for ( sal_uInt16 i = 0; i < aColumns.Count(); ++i ) |
| if ( !(*aColumns[i] == *rCmp.GetColumns()[i]) ) |
| return 0; |
| |
| return 1; |
| } |
| |
| SfxPoolItem* SwFmtCol::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtCol( *this ); |
| } |
| |
| sal_uInt16 SwFmtCol::GetGutterWidth( sal_Bool bMin ) const |
| { |
| sal_uInt16 nRet = 0; |
| if ( aColumns.Count() == 2 ) |
| nRet = aColumns[0]->GetRight() + aColumns[1]->GetLeft(); |
| else if ( aColumns.Count() > 2 ) |
| { |
| sal_Bool bSet = sal_False; |
| for ( sal_uInt16 i = 1; i < aColumns.Count()-1; ++i ) |
| { |
| const sal_uInt16 nTmp = aColumns[i]->GetRight() + aColumns[i+1]->GetLeft(); |
| if ( bSet ) |
| { |
| if ( nTmp != nRet ) |
| { |
| if ( !bMin ) |
| return USHRT_MAX; |
| if ( nRet > nTmp ) |
| nRet = nTmp; |
| } |
| } |
| else |
| { bSet = sal_True; |
| nRet = nTmp; |
| } |
| } |
| } |
| return nRet; |
| } |
| |
| void SwFmtCol::SetGutterWidth( sal_uInt16 nNew, sal_uInt16 nAct ) |
| { |
| if ( bOrtho ) |
| Calc( nNew, nAct ); |
| else |
| { |
| sal_uInt16 nHalf = nNew / 2; |
| for ( sal_uInt16 i = 0; i < aColumns.Count(); ++i ) |
| { SwColumn *pCol = aColumns[i]; |
| pCol->SetLeft ( nHalf ); |
| pCol->SetRight( nHalf ); |
| if ( i == 0 ) |
| pCol->SetLeft( 0 ); |
| else if ( i == (aColumns.Count() - 1) ) |
| pCol->SetRight( 0 ); |
| } |
| } |
| } |
| |
| void SwFmtCol::Init( sal_uInt16 nNumCols, sal_uInt16 nGutterWidth, sal_uInt16 nAct ) |
| { |
| //Loeschen scheint hier auf den erste Blick vielleicht etwas zu heftig; |
| //anderfalls muessten allerdings alle Werte der verbleibenden SwColumn's |
| //initialisiert werden. |
| if ( aColumns.Count() ) |
| aColumns.DeleteAndDestroy( 0, aColumns.Count() ); |
| for ( sal_uInt16 i = 0; i < nNumCols; ++i ) |
| { SwColumn *pCol = new SwColumn; |
| aColumns.Insert( pCol, i ); |
| } |
| bOrtho = sal_True; |
| nWidth = USHRT_MAX; |
| if( nNumCols ) |
| Calc( nGutterWidth, nAct ); |
| } |
| |
| void SwFmtCol::SetOrtho( sal_Bool bNew, sal_uInt16 nGutterWidth, sal_uInt16 nAct ) |
| { |
| bOrtho = bNew; |
| if ( bNew && aColumns.Count() ) |
| Calc( nGutterWidth, nAct ); |
| } |
| |
| sal_uInt16 SwFmtCol::CalcColWidth( sal_uInt16 nCol, sal_uInt16 nAct ) const |
| { |
| ASSERT( nCol < aColumns.Count(), ":-( ColumnsArr ueberindiziert." ); |
| if ( nWidth != nAct ) |
| { |
| long nW = aColumns[nCol]->GetWishWidth(); |
| nW *= nAct; |
| nW /= nWidth; |
| return sal_uInt16(nW); |
| } |
| else |
| return aColumns[nCol]->GetWishWidth(); |
| } |
| |
| sal_uInt16 SwFmtCol::CalcPrtColWidth( sal_uInt16 nCol, sal_uInt16 nAct ) const |
| { |
| ASSERT( nCol < aColumns.Count(), ":-( ColumnsArr ueberindiziert." ); |
| sal_uInt16 nRet = CalcColWidth( nCol, nAct ); |
| SwColumn *pCol = aColumns[nCol]; |
| nRet = nRet - pCol->GetLeft(); |
| nRet = nRet - pCol->GetRight(); |
| return nRet; |
| } |
| |
| void SwFmtCol::Calc( sal_uInt16 nGutterWidth, sal_uInt16 nAct ) |
| { |
| if(!GetNumCols()) |
| return; |
| //Erstmal die Spalten mit der Aktuellen Breite einstellen, dann die |
| //Wunschbreite der Spalten anhand der Gesamtwunschbreite hochrechnen. |
| |
| const sal_uInt16 nGutterHalf = nGutterWidth ? nGutterWidth / 2 : 0; |
| |
| //Breite der PrtAreas ist Gesamtbreite - Zwischenraeume / Anzahl |
| const sal_uInt16 nPrtWidth = |
| (nAct - ((GetNumCols()-1) * nGutterWidth)) / GetNumCols(); |
| sal_uInt16 nAvail = nAct; |
| |
| //Die erste Spalte ist PrtBreite + (Zwischenraumbreite/2) |
| const sal_uInt16 nLeftWidth = nPrtWidth + nGutterHalf; |
| SwColumn *pCol = aColumns[0]; |
| pCol->SetWishWidth( nLeftWidth ); |
| pCol->SetRight( nGutterHalf ); |
| pCol->SetLeft ( 0 ); |
| nAvail = nAvail - nLeftWidth; |
| |
| //Spalte 2 bis n-1 ist PrtBreite + Zwischenraumbreite |
| const sal_uInt16 nMidWidth = nPrtWidth + nGutterWidth; |
| sal_uInt16 i; |
| |
| for ( i = 1; i < GetNumCols()-1; ++i ) |
| { |
| pCol = aColumns[i]; |
| pCol->SetWishWidth( nMidWidth ); |
| pCol->SetLeft ( nGutterHalf ); |
| pCol->SetRight( nGutterHalf ); |
| nAvail = nAvail - nMidWidth; |
| } |
| |
| //Die Letzte Spalte entspricht wieder der ersten, um Rundungsfehler |
| //auszugleichen wird der letzten Spalte alles zugeschlagen was die |
| //anderen nicht verbraucht haben. |
| pCol = aColumns[aColumns.Count()-1]; |
| pCol->SetWishWidth( nAvail ); |
| pCol->SetLeft ( nGutterHalf ); |
| pCol->SetRight( 0 ); |
| |
| //Umrechnen der aktuellen Breiten in Wunschbreiten. |
| for ( i = 0; i < aColumns.Count(); ++i ) |
| { |
| pCol = aColumns[i]; |
| long nTmp = pCol->GetWishWidth(); |
| nTmp *= GetWishWidth(); |
| nTmp /= nAct; |
| pCol->SetWishWidth( sal_uInt16(nTmp) ); |
| } |
| } |
| |
| sal_Bool SwFmtCol::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| if(MID_COLUMN_SEPARATOR_LINE == nMemberId) |
| { |
| DBG_ERROR("not implemented"); |
| } |
| else |
| { |
| uno::Reference< text::XTextColumns > xCols = new SwXTextColumns(*this); |
| rVal.setValue(&xCols, ::getCppuType((uno::Reference< text::XTextColumns>*)0)); |
| } |
| return sal_True; |
| } |
| |
| sal_Bool SwFmtCol::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_False; |
| if(MID_COLUMN_SEPARATOR_LINE == nMemberId) |
| { |
| DBG_ERROR("not implemented"); |
| } |
| else |
| { |
| uno::Reference< text::XTextColumns > xCols; |
| rVal >>= xCols; |
| if(xCols.is()) |
| { |
| uno::Sequence<text::TextColumn> aSetColumns = xCols->getColumns(); |
| const text::TextColumn* pArray = aSetColumns.getConstArray(); |
| aColumns.DeleteAndDestroy(0, aColumns.Count()); |
| //max. Count ist hier 64K - das kann das Array aber nicht |
| sal_uInt16 nCount = Min( (sal_uInt16)aSetColumns.getLength(), |
| (sal_uInt16) 0x3fff ); |
| sal_uInt16 nWidthSum = 0; |
| // #101224# one column is no column |
| // |
| if(nCount > 1) |
| for(sal_uInt16 i = 0; i < nCount; i++) |
| { |
| SwColumn* pCol = new SwColumn; |
| pCol->SetWishWidth( static_cast<sal_uInt16>(pArray[i].Width) ); |
| nWidthSum = static_cast<sal_uInt16>(nWidthSum + pArray[i].Width); |
| pCol->SetLeft ( static_cast<sal_uInt16>(MM100_TO_TWIP(pArray[i].LeftMargin)) ); |
| pCol->SetRight( static_cast<sal_uInt16>(MM100_TO_TWIP(pArray[i].RightMargin)) ); |
| aColumns.Insert(pCol, i); |
| } |
| bRet = sal_True; |
| nWidth = nWidthSum; |
| bOrtho = sal_False; |
| |
| uno::Reference<lang::XUnoTunnel> xNumTunnel(xCols, uno::UNO_QUERY); |
| SwXTextColumns* pSwColums = 0; |
| if(xNumTunnel.is()) |
| { |
| pSwColums = reinterpret_cast< SwXTextColumns * >( |
| sal::static_int_cast< sal_IntPtr >( |
| xNumTunnel->getSomething( SwXTextColumns::getUnoTunnelId() ))); |
| } |
| if(pSwColums) |
| { |
| bOrtho = pSwColums->IsAutomaticWidth(); |
| nLineWidth = pSwColums->GetSepLineWidth(); |
| aLineColor.SetColor(pSwColums->GetSepLineColor()); |
| nLineHeight = pSwColums->GetSepLineHeightRelative(); |
| if(!pSwColums->GetSepLineIsOn()) |
| eAdj = COLADJ_NONE; |
| else switch(pSwColums->GetSepLineVertAlign()) |
| { |
| case 0: eAdj = COLADJ_TOP; break; //VerticalAlignment_TOP |
| case 1: eAdj = COLADJ_CENTER;break; //VerticalAlignment_MIDDLE |
| case 2: eAdj = COLADJ_BOTTOM;break; //VerticalAlignment_BOTTOM |
| default: ASSERT( !this, "unknown alignment" ); break; |
| } |
| } |
| } |
| } |
| return bRet; |
| } |
| |
| |
| // class SwFmtSurround |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtSurround::SwFmtSurround( SwSurround eFly ) : |
| SfxEnumItem( RES_SURROUND, sal_uInt16( eFly ) ) |
| { |
| bAnchorOnly = bContour = bOutside = sal_False; |
| } |
| |
| SwFmtSurround::SwFmtSurround( const SwFmtSurround &rCpy ) : |
| SfxEnumItem( RES_SURROUND, rCpy.GetValue() ) |
| { |
| bAnchorOnly = rCpy.bAnchorOnly; |
| bContour = rCpy.bContour; |
| bOutside = rCpy.bOutside; |
| } |
| |
| int SwFmtSurround::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return ( GetValue() == ((SwFmtSurround&)rAttr).GetValue() && |
| bAnchorOnly== ((SwFmtSurround&)rAttr).bAnchorOnly && |
| bContour== ((SwFmtSurround&)rAttr).bContour && |
| bOutside== ((SwFmtSurround&)rAttr).bOutside ); |
| } |
| |
| SfxPoolItem* SwFmtSurround::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtSurround( *this ); |
| } |
| |
| sal_uInt16 SwFmtSurround::GetValueCount() const |
| { |
| return SURROUND_END - SURROUND_BEGIN; |
| } |
| |
| |
| sal_Bool SwFmtSurround::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_SURROUND_SURROUNDTYPE: |
| rVal <<= (text::WrapTextMode)GetSurround(); |
| break; |
| case MID_SURROUND_ANCHORONLY: |
| { |
| sal_Bool bTmp = IsAnchorOnly(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_SURROUND_CONTOUR: |
| { |
| sal_Bool bTmp = IsContour(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_SURROUND_CONTOUROUTSIDE: |
| { |
| sal_Bool bTmp = IsOutside(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtSurround::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_SURROUND_SURROUNDTYPE: |
| { |
| sal_Int32 eVal = SWUnoHelper::GetEnumAsInt32( rVal ); |
| if( eVal >= 0 && eVal < (sal_Int16)SURROUND_END ) |
| SetValue( static_cast<sal_uInt16>(eVal) ); |
| else { |
| //exception |
| ; |
| } |
| } |
| break; |
| |
| case MID_SURROUND_ANCHORONLY: |
| SetAnchorOnly( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_SURROUND_CONTOUR: |
| SetContour( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_SURROUND_CONTOUROUTSIDE: |
| SetOutside( *(sal_Bool*)rVal.getValue() ); |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| // class SwFmtVertOrient |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtVertOrient::SwFmtVertOrient( SwTwips nY, sal_Int16 eVert, |
| sal_Int16 eRel ) |
| : SfxPoolItem( RES_VERT_ORIENT ), |
| nYPos( nY ), |
| eOrient( eVert ), |
| eRelation( eRel ) |
| {} |
| |
| int SwFmtVertOrient::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return ( nYPos == ((SwFmtVertOrient&)rAttr).nYPos && |
| eOrient == ((SwFmtVertOrient&)rAttr).eOrient && |
| eRelation == ((SwFmtVertOrient&)rAttr).eRelation ); |
| } |
| |
| SfxPoolItem* SwFmtVertOrient::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtVertOrient( nYPos, eOrient, eRelation ); |
| } |
| |
| sal_Bool SwFmtVertOrient::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_VERTORIENT_ORIENT: |
| { |
| sal_Int16 nRet = text::VertOrientation::NONE; |
| switch( eOrient ) |
| { |
| case text::VertOrientation::TOP : nRet = text::VertOrientation::TOP ;break; |
| case text::VertOrientation::CENTER : nRet = text::VertOrientation::CENTER ;break; |
| case text::VertOrientation::BOTTOM : nRet = text::VertOrientation::BOTTOM ;break; |
| case text::VertOrientation::CHAR_TOP : nRet = text::VertOrientation::CHAR_TOP ;break; |
| case text::VertOrientation::CHAR_CENTER: nRet = text::VertOrientation::CHAR_CENTER;break; |
| case text::VertOrientation::CHAR_BOTTOM: nRet = text::VertOrientation::CHAR_BOTTOM;break; |
| case text::VertOrientation::LINE_TOP : nRet = text::VertOrientation::LINE_TOP ;break; |
| case text::VertOrientation::LINE_CENTER: nRet = text::VertOrientation::LINE_CENTER;break; |
| case text::VertOrientation::LINE_BOTTOM: nRet = text::VertOrientation::LINE_BOTTOM;break; |
| default: break; |
| } |
| rVal <<= nRet; |
| } |
| break; |
| case MID_VERTORIENT_RELATION: |
| rVal <<= lcl_RelToINT(eRelation); |
| break; |
| case MID_VERTORIENT_POSITION: |
| rVal <<= (sal_Int32)TWIP_TO_MM100(GetPos()); |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtVertOrient::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| sal_Bool bConvert = 0 != (nMemberId&CONVERT_TWIPS); |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_VERTORIENT_ORIENT: |
| { |
| sal_uInt16 nVal = 0; |
| rVal >>= nVal; |
| switch( nVal ) |
| { |
| case text::VertOrientation::NONE: eOrient = text::VertOrientation::NONE; break; |
| case text::VertOrientation::TOP : eOrient = text::VertOrientation::TOP; break; |
| case text::VertOrientation::CENTER : eOrient = text::VertOrientation::CENTER; break; |
| case text::VertOrientation::BOTTOM : eOrient = text::VertOrientation::BOTTOM; break; |
| case text::VertOrientation::CHAR_TOP : eOrient = text::VertOrientation::CHAR_TOP; break; |
| case text::VertOrientation::CHAR_CENTER: eOrient = text::VertOrientation::CHAR_CENTER;break; |
| case text::VertOrientation::CHAR_BOTTOM: eOrient = text::VertOrientation::CHAR_BOTTOM;break; |
| case text::VertOrientation::LINE_TOP : eOrient = text::VertOrientation::LINE_TOP; break; |
| case text::VertOrientation::LINE_CENTER: eOrient = text::VertOrientation::LINE_CENTER;break; |
| case text::VertOrientation::LINE_BOTTOM: eOrient = text::VertOrientation::LINE_BOTTOM;break; |
| } |
| } |
| break; |
| case MID_VERTORIENT_RELATION: |
| { |
| eRelation = lcl_IntToRelation(rVal); |
| } |
| break; |
| case MID_VERTORIENT_POSITION: |
| { |
| sal_Int32 nVal = 0; |
| rVal >>= nVal; |
| if(bConvert) |
| nVal = MM100_TO_TWIP(nVal); |
| SetPos( nVal ); |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| |
| |
| // class SwFmtHoriOrient |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtHoriOrient::SwFmtHoriOrient( SwTwips nX, sal_Int16 eHori, |
| sal_Int16 eRel, sal_Bool bPos ) |
| : SfxPoolItem( RES_HORI_ORIENT ), |
| nXPos( nX ), |
| eOrient( eHori ), |
| eRelation( eRel ), |
| bPosToggle( bPos ) |
| {} |
| |
| int SwFmtHoriOrient::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return ( nXPos == ((SwFmtHoriOrient&)rAttr).nXPos && |
| eOrient == ((SwFmtHoriOrient&)rAttr).eOrient && |
| eRelation == ((SwFmtHoriOrient&)rAttr).eRelation && |
| bPosToggle == ((SwFmtHoriOrient&)rAttr).bPosToggle ); |
| } |
| |
| SfxPoolItem* SwFmtHoriOrient::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtHoriOrient( nXPos, eOrient, eRelation, bPosToggle ); |
| } |
| |
| sal_Bool SwFmtHoriOrient::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_HORIORIENT_ORIENT: |
| { |
| sal_Int16 nRet = text::HoriOrientation::NONE; |
| switch( eOrient ) |
| { |
| case text::HoriOrientation::RIGHT: nRet = text::HoriOrientation::RIGHT; break; |
| case text::HoriOrientation::CENTER : nRet = text::HoriOrientation::CENTER; break; |
| case text::HoriOrientation::LEFT : nRet = text::HoriOrientation::LEFT; break; |
| case text::HoriOrientation::INSIDE : nRet = text::HoriOrientation::INSIDE; break; |
| case text::HoriOrientation::OUTSIDE: nRet = text::HoriOrientation::OUTSIDE; break; |
| case text::HoriOrientation::FULL: nRet = text::HoriOrientation::FULL; break; |
| case text::HoriOrientation::LEFT_AND_WIDTH : |
| nRet = text::HoriOrientation::LEFT_AND_WIDTH; |
| break; |
| default: |
| break; |
| |
| } |
| rVal <<= nRet; |
| } |
| break; |
| case MID_HORIORIENT_RELATION: |
| rVal <<= lcl_RelToINT(eRelation); |
| break; |
| case MID_HORIORIENT_POSITION: |
| rVal <<= (sal_Int32)TWIP_TO_MM100(GetPos()); |
| break; |
| case MID_HORIORIENT_PAGETOGGLE: |
| { |
| sal_Bool bTmp = IsPosToggle(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtHoriOrient::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| sal_Bool bConvert = 0 != (nMemberId&CONVERT_TWIPS); |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_HORIORIENT_ORIENT: |
| { |
| sal_Int16 nVal = 0; |
| rVal >>= nVal; |
| switch( nVal ) |
| { |
| case text::HoriOrientation::NONE: eOrient = text::HoriOrientation::NONE ; break; |
| case text::HoriOrientation::RIGHT: eOrient = text::HoriOrientation::RIGHT; break; |
| case text::HoriOrientation::CENTER : eOrient = text::HoriOrientation::CENTER; break; |
| case text::HoriOrientation::LEFT : eOrient = text::HoriOrientation::LEFT; break; |
| case text::HoriOrientation::INSIDE : eOrient = text::HoriOrientation::INSIDE; break; |
| case text::HoriOrientation::OUTSIDE: eOrient = text::HoriOrientation::OUTSIDE; break; |
| case text::HoriOrientation::FULL: eOrient = text::HoriOrientation::FULL; break; |
| case text::HoriOrientation::LEFT_AND_WIDTH: |
| eOrient = text::HoriOrientation::LEFT_AND_WIDTH; |
| break; |
| } |
| } |
| break; |
| case MID_HORIORIENT_RELATION: |
| { |
| eRelation = lcl_IntToRelation(rVal); |
| } |
| break; |
| case MID_HORIORIENT_POSITION: |
| { |
| sal_Int32 nVal = 0; |
| if(!(rVal >>= nVal)) |
| bRet = sal_False; |
| if(bConvert) |
| nVal = MM100_TO_TWIP(nVal); |
| SetPos( nVal ); |
| } |
| break; |
| case MID_HORIORIENT_PAGETOGGLE: |
| SetPosToggle( *(sal_Bool*)rVal.getValue()); |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| |
| |
| // class SwFmtAnchor |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtAnchor::SwFmtAnchor( RndStdIds nRnd, sal_uInt16 nPage ) |
| : SfxPoolItem( RES_ANCHOR ), |
| pCntntAnchor( 0 ), |
| nAnchorId( nRnd ), |
| nPageNum( nPage ), |
| // OD 2004-05-05 #i28701# - get always new increased order number |
| mnOrder( ++mnOrderCounter ) |
| {} |
| |
| SwFmtAnchor::SwFmtAnchor( const SwFmtAnchor &rCpy ) |
| : SfxPoolItem( RES_ANCHOR ), |
| nAnchorId( rCpy.GetAnchorId() ), |
| nPageNum( rCpy.GetPageNum() ), |
| // OD 2004-05-05 #i28701# - get always new increased order number |
| mnOrder( ++mnOrderCounter ) |
| { |
| pCntntAnchor = rCpy.GetCntntAnchor() ? |
| new SwPosition( *rCpy.GetCntntAnchor() ) : 0; |
| } |
| |
| SwFmtAnchor::~SwFmtAnchor() |
| { |
| delete pCntntAnchor; |
| } |
| |
| void SwFmtAnchor::SetAnchor( const SwPosition *pPos ) |
| { |
| if ( pCntntAnchor ) |
| delete pCntntAnchor; |
| pCntntAnchor = pPos ? new SwPosition( *pPos ) : 0; |
| //AM Absatz gebundene Flys sollten nie in den Absatz hineinzeigen. |
| if (pCntntAnchor && |
| ((FLY_AT_PARA == nAnchorId) || (FLY_AT_FLY == nAnchorId))) |
| { |
| pCntntAnchor->nContent.Assign( 0, 0 ); |
| } |
| } |
| |
| SwFmtAnchor& SwFmtAnchor::operator=(const SwFmtAnchor& rAnchor) |
| { |
| nAnchorId = rAnchor.GetAnchorId(); |
| nPageNum = rAnchor.GetPageNum(); |
| // OD 2004-05-05 #i28701# - get always new increased order number |
| mnOrder = ++mnOrderCounter; |
| |
| delete pCntntAnchor; |
| pCntntAnchor = rAnchor.pCntntAnchor ? |
| new SwPosition(*(rAnchor.pCntntAnchor)) : 0; |
| return *this; |
| } |
| |
| int SwFmtAnchor::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| // OD 2004-05-05 #i28701# - Note: <mnOrder> hasn't to be considered. |
| return ( nAnchorId == ((SwFmtAnchor&)rAttr).GetAnchorId() && |
| nPageNum == ((SwFmtAnchor&)rAttr).GetPageNum() && |
| //Anker vergleichen. Entweder zeigen beide auf das gleiche |
| //Attribut bzw. sind 0 oder die SwPosition* sind beide |
| //gueltig und die SwPositions sind gleich. |
| (pCntntAnchor == ((SwFmtAnchor&)rAttr).GetCntntAnchor() || |
| (pCntntAnchor && ((SwFmtAnchor&)rAttr).GetCntntAnchor() && |
| *pCntntAnchor == *((SwFmtAnchor&)rAttr).GetCntntAnchor()))); |
| } |
| |
| SfxPoolItem* SwFmtAnchor::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtAnchor( *this ); |
| } |
| |
| // OD 2004-05-05 #i28701# |
| sal_uInt32 SwFmtAnchor::mnOrderCounter = 0; |
| |
| // OD 2004-05-05 #i28701# |
| sal_uInt32 SwFmtAnchor::GetOrder() const |
| { |
| return mnOrder; |
| } |
| |
| /*-----------------16.02.98 15:21------------------- |
| |
| --------------------------------------------------*/ |
| sal_Bool SwFmtAnchor::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_ANCHOR_ANCHORTYPE: |
| |
| text::TextContentAnchorType eRet; |
| switch (GetAnchorId()) |
| { |
| case FLY_AT_CHAR: |
| eRet = text::TextContentAnchorType_AT_CHARACTER; |
| break; |
| case FLY_AT_PAGE: |
| eRet = text::TextContentAnchorType_AT_PAGE; |
| break; |
| case FLY_AT_FLY: |
| eRet = text::TextContentAnchorType_AT_FRAME; |
| break; |
| case FLY_AS_CHAR: |
| eRet = text::TextContentAnchorType_AS_CHARACTER; |
| break; |
| //case FLY_AT_PARA: |
| default: |
| eRet = text::TextContentAnchorType_AT_PARAGRAPH; |
| } |
| rVal <<= eRet; |
| break; |
| case MID_ANCHOR_PAGENUM: |
| rVal <<= (sal_Int16)GetPageNum(); |
| break; |
| case MID_ANCHOR_ANCHORFRAME: |
| { |
| if(pCntntAnchor && FLY_AT_FLY == nAnchorId) |
| { |
| SwFrmFmt* pFmt = pCntntAnchor->nNode.GetNode().GetFlyFmt(); |
| if(pFmt) |
| { |
| uno::Reference<container::XNamed> xNamed = SwXFrames::GetObject( *pFmt, FLYCNTTYPE_FRM ); |
| uno::Reference<text::XTextFrame> xRet(xNamed, uno::UNO_QUERY); |
| rVal <<= xRet; |
| } |
| } |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtAnchor::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_ANCHOR_ANCHORTYPE: |
| { |
| RndStdIds eAnchor; |
| switch( SWUnoHelper::GetEnumAsInt32( rVal ) ) |
| { |
| case text::TextContentAnchorType_AS_CHARACTER: |
| eAnchor = FLY_AS_CHAR; |
| break; |
| case text::TextContentAnchorType_AT_PAGE: |
| eAnchor = FLY_AT_PAGE; |
| if( GetPageNum() > 0 && pCntntAnchor ) |
| { |
| // If the anchor type is page and a valid page number |
| // has been set, the content position isn't required |
| // any longer. |
| delete pCntntAnchor; |
| pCntntAnchor = 0; |
| } |
| break; |
| case text::TextContentAnchorType_AT_FRAME: |
| eAnchor = FLY_AT_FLY; |
| break; |
| case text::TextContentAnchorType_AT_CHARACTER: |
| eAnchor = FLY_AT_CHAR; |
| break; |
| //case text::TextContentAnchorType_AT_PARAGRAPH: |
| default: |
| eAnchor = FLY_AT_PARA; |
| break; |
| } |
| SetType( eAnchor ); |
| } |
| break; |
| case MID_ANCHOR_PAGENUM: |
| { |
| sal_Int16 nVal = 0; |
| if((rVal >>= nVal) && nVal > 0) |
| { |
| SetPageNum( nVal ); |
| if ((FLY_AT_PAGE == GetAnchorId()) && pCntntAnchor) |
| { |
| // If the anchor type is page and a valid page number |
| // is set, the content paoition has to be deleted to not |
| // confuse the layout (frmtool.cxx). However, if the |
| // anchor type is not page, any content position will |
| // be kept. |
| delete pCntntAnchor; |
| pCntntAnchor = 0; |
| } |
| } |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_ANCHOR_ANCHORFRAME: |
| //no break here!; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| // class SwFmtURL |
| // Implementierung teilweise inline im hxx |
| |
| SwFmtURL::SwFmtURL() : |
| SfxPoolItem( RES_URL ), |
| pMap( 0 ), |
| bIsServerMap( sal_False ) |
| { |
| } |
| |
| SwFmtURL::SwFmtURL( const SwFmtURL &rURL) : |
| SfxPoolItem( RES_URL ), |
| sTargetFrameName( rURL.GetTargetFrameName() ), |
| sURL( rURL.GetURL() ), |
| sName( rURL.GetName() ), |
| bIsServerMap( rURL.IsServerMap() ) |
| { |
| pMap = rURL.GetMap() ? new ImageMap( *rURL.GetMap() ) : 0; |
| } |
| |
| SwFmtURL::~SwFmtURL() |
| { |
| if ( pMap ) |
| delete pMap; |
| } |
| |
| int SwFmtURL::operator==( const SfxPoolItem &rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| const SwFmtURL &rCmp = (SwFmtURL&)rAttr; |
| sal_Bool bRet = bIsServerMap == rCmp.IsServerMap() && |
| sURL == rCmp.GetURL() && |
| sTargetFrameName == rCmp.GetTargetFrameName() && |
| sName == rCmp.GetName(); |
| if ( bRet ) |
| { |
| if ( pMap && rCmp.GetMap() ) |
| bRet = *pMap == *rCmp.GetMap(); |
| else |
| bRet = pMap == rCmp.GetMap(); |
| } |
| return bRet; |
| } |
| |
| SfxPoolItem* SwFmtURL::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtURL( *this ); |
| } |
| |
| void SwFmtURL::SetURL( const XubString &rURL, sal_Bool bServerMap ) |
| { |
| sURL = rURL; |
| bIsServerMap = bServerMap; |
| } |
| |
| void SwFmtURL::SetMap( const ImageMap *pM ) |
| { |
| if ( pMap ) |
| delete pMap; |
| pMap = pM ? new ImageMap( *pM ) : 0; |
| } |
| extern const SvEventDescription* lcl_GetSupportedMacroItems(); |
| |
| sal_Bool SwFmtURL::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_URL_URL: |
| { |
| OUString sRet = GetURL(); |
| rVal <<= sRet; |
| } |
| break; |
| case MID_URL_TARGET: |
| { |
| OUString sRet = GetTargetFrameName(); |
| rVal <<= sRet; |
| } |
| break; |
| case MID_URL_HYPERLINKNAME: |
| rVal <<= OUString( GetName() ); |
| break; |
| case MID_URL_CLIENTMAP: |
| { |
| uno::Reference< uno::XInterface > xInt; |
| if(pMap) |
| { |
| xInt = SvUnoImageMap_createInstance( *pMap, lcl_GetSupportedMacroItems() ); |
| } |
| else |
| { |
| ImageMap aEmptyMap; |
| xInt = SvUnoImageMap_createInstance( aEmptyMap, lcl_GetSupportedMacroItems() ); |
| } |
| uno::Reference< container::XIndexContainer > xCont(xInt, uno::UNO_QUERY); |
| rVal <<= xCont; |
| } |
| break; |
| case MID_URL_SERVERMAP: |
| { |
| sal_Bool bTmp = IsServerMap(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtURL::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_URL_URL: |
| { |
| OUString sTmp; |
| rVal >>= sTmp; |
| SetURL( sTmp, bIsServerMap ); |
| } |
| break; |
| case MID_URL_TARGET: |
| { |
| OUString sTmp; |
| rVal >>= sTmp; |
| SetTargetFrameName( sTmp ); |
| } |
| break; |
| case MID_URL_HYPERLINKNAME: |
| { |
| OUString sTmp; |
| rVal >>= sTmp; |
| SetName( sTmp ); |
| } |
| break; |
| case MID_URL_CLIENTMAP: |
| { |
| uno::Reference<container::XIndexContainer> xCont; |
| if(!rVal.hasValue()) |
| DELETEZ(pMap); |
| else if(rVal >>= xCont) |
| { |
| if(!pMap) |
| pMap = new ImageMap; |
| bRet = SvUnoImageMap_fillImageMap( xCont, *pMap ); |
| } |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_URL_SERVERMAP: |
| bIsServerMap = *(sal_Bool*)rVal.getValue(); |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| |
| // class SwNoReadOnly |
| |
| SfxPoolItem* SwFmtEditInReadonly::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtEditInReadonly( Which(), GetValue() ); |
| } |
| |
| // class SwFmtLayoutSplit |
| |
| SfxPoolItem* SwFmtLayoutSplit::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtLayoutSplit( GetValue() ); |
| } |
| |
| // class SwFmtRowSplit |
| |
| SfxPoolItem* SwFmtRowSplit::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtRowSplit( GetValue() ); |
| } |
| |
| |
| // class SwFmtNoBalancedColumns |
| |
| SfxPoolItem* SwFmtNoBalancedColumns::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtNoBalancedColumns( GetValue() ); |
| } |
| |
| // class SwFmtFtnEndAtTxtEnd |
| |
| sal_uInt16 SwFmtFtnEndAtTxtEnd::GetValueCount() const |
| { |
| return sal_uInt16( FTNEND_ATTXTEND_END ); |
| } |
| |
| SwFmtFtnEndAtTxtEnd& SwFmtFtnEndAtTxtEnd::operator=( |
| const SwFmtFtnEndAtTxtEnd& rAttr ) |
| { |
| SfxEnumItem::SetValue( rAttr.GetValue() ); |
| aFmt = rAttr.aFmt; |
| nOffset = rAttr.nOffset; |
| sPrefix = rAttr.sPrefix; |
| sSuffix = rAttr.sSuffix; |
| return *this; |
| } |
| |
| int SwFmtFtnEndAtTxtEnd::operator==( const SfxPoolItem& rItem ) const |
| { |
| const SwFmtFtnEndAtTxtEnd& rAttr = (SwFmtFtnEndAtTxtEnd&)rItem; |
| return SfxEnumItem::operator==( rAttr ) && |
| aFmt.GetNumberingType() == rAttr.aFmt.GetNumberingType() && |
| nOffset == rAttr.nOffset && |
| sPrefix == rAttr.sPrefix && |
| sSuffix == rAttr.sSuffix; |
| } |
| |
| sal_Bool SwFmtFtnEndAtTxtEnd::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| nMemberId &= ~CONVERT_TWIPS; |
| switch(nMemberId) |
| { |
| case MID_COLLECT : |
| { |
| sal_Bool bVal = GetValue() >= FTNEND_ATTXTEND; |
| rVal.setValue(&bVal, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_RESTART_NUM : |
| { |
| sal_Bool bVal = GetValue() >= FTNEND_ATTXTEND_OWNNUMSEQ; |
| rVal.setValue(&bVal, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_NUM_START_AT: rVal <<= (sal_Int16) nOffset; break; |
| case MID_OWN_NUM : |
| { |
| sal_Bool bVal = GetValue() >= FTNEND_ATTXTEND_OWNNUMANDFMT; |
| rVal.setValue(&bVal, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_NUM_TYPE : rVal <<= aFmt.GetNumberingType(); break; |
| case MID_PREFIX : rVal <<= OUString(sPrefix); break; |
| case MID_SUFFIX : rVal <<= OUString(sSuffix); break; |
| default: return sal_False; |
| } |
| return sal_True; |
| } |
| |
| sal_Bool SwFmtFtnEndAtTxtEnd::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| sal_Bool bRet = sal_True; |
| nMemberId &= ~CONVERT_TWIPS; |
| switch(nMemberId) |
| { |
| case MID_COLLECT : |
| { |
| sal_Bool bVal = *(sal_Bool*)rVal.getValue(); |
| if(!bVal && GetValue() >= FTNEND_ATTXTEND) |
| SetValue(FTNEND_ATPGORDOCEND); |
| else if(bVal && GetValue() < FTNEND_ATTXTEND) |
| SetValue(FTNEND_ATTXTEND); |
| } |
| break; |
| case MID_RESTART_NUM : |
| { |
| sal_Bool bVal = *(sal_Bool*)rVal.getValue(); |
| if(!bVal && GetValue() >= FTNEND_ATTXTEND_OWNNUMSEQ) |
| SetValue(FTNEND_ATTXTEND); |
| else if(bVal && GetValue() < FTNEND_ATTXTEND_OWNNUMSEQ) |
| SetValue(FTNEND_ATTXTEND_OWNNUMSEQ); |
| } |
| break; |
| case MID_NUM_START_AT: |
| { |
| sal_Int16 nVal = 0; |
| rVal >>= nVal; |
| if(nVal >= 0) |
| nOffset = nVal; |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_OWN_NUM : |
| { |
| sal_Bool bVal = *(sal_Bool*)rVal.getValue(); |
| if(!bVal && GetValue() >= FTNEND_ATTXTEND_OWNNUMANDFMT) |
| SetValue(FTNEND_ATTXTEND_OWNNUMSEQ); |
| else if(bVal && GetValue() < FTNEND_ATTXTEND_OWNNUMANDFMT) |
| SetValue(FTNEND_ATTXTEND_OWNNUMANDFMT); |
| } |
| break; |
| case MID_NUM_TYPE : |
| { |
| sal_Int16 nVal = 0; |
| rVal >>= nVal; |
| if(nVal >= 0 && |
| (nVal <= SVX_NUM_ARABIC || |
| SVX_NUM_CHARS_UPPER_LETTER_N == nVal || |
| SVX_NUM_CHARS_LOWER_LETTER_N == nVal )) |
| aFmt.SetNumberingType(nVal); |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_PREFIX : |
| { |
| OUString sVal; rVal >>= sVal; |
| sPrefix = sVal; |
| } |
| break; |
| case MID_SUFFIX : |
| { |
| OUString sVal; rVal >>= sVal; |
| sSuffix = sVal; |
| } |
| break; |
| default: bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| |
| // class SwFmtFtnAtTxtEnd |
| |
| SfxPoolItem* SwFmtFtnAtTxtEnd::Clone( SfxItemPool* ) const |
| { |
| SwFmtFtnAtTxtEnd* pNew = new SwFmtFtnAtTxtEnd; |
| *pNew = *this; |
| return pNew; |
| } |
| |
| // class SwFmtEndAtTxtEnd |
| |
| SfxPoolItem* SwFmtEndAtTxtEnd::Clone( SfxItemPool* ) const |
| { |
| SwFmtEndAtTxtEnd* pNew = new SwFmtEndAtTxtEnd; |
| *pNew = *this; |
| return pNew; |
| } |
| |
| //class SwFmtChain |
| |
| |
| int SwFmtChain::operator==( const SfxPoolItem &rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| |
| return GetPrev() == ((SwFmtChain&)rAttr).GetPrev() && |
| GetNext() == ((SwFmtChain&)rAttr).GetNext(); |
| } |
| |
| SwFmtChain::SwFmtChain( const SwFmtChain &rCpy ) : |
| SfxPoolItem( RES_CHAIN ) |
| { |
| SetPrev( rCpy.GetPrev() ); |
| SetNext( rCpy.GetNext() ); |
| } |
| |
| SfxPoolItem* SwFmtChain::Clone( SfxItemPool* ) const |
| { |
| SwFmtChain *pRet = new SwFmtChain; |
| pRet->SetPrev( GetPrev() ); |
| pRet->SetNext( GetNext() ); |
| return pRet; |
| } |
| |
| void SwFmtChain::SetPrev( SwFlyFrmFmt *pFmt ) |
| { |
| if ( pFmt ) |
| pFmt->Add( &aPrev ); |
| else if ( aPrev.GetRegisteredIn() ) |
| ((SwModify*)aPrev.GetRegisteredIn())->Remove( &aPrev ); |
| } |
| |
| void SwFmtChain::SetNext( SwFlyFrmFmt *pFmt ) |
| { |
| if ( pFmt ) |
| pFmt->Add( &aNext ); |
| else if ( aNext.GetRegisteredIn() ) |
| ((SwModify*)aNext.GetRegisteredIn())->Remove( &aNext ); |
| } |
| |
| sal_Bool SwFmtChain::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| XubString aRet; |
| switch ( nMemberId ) |
| { |
| case MID_CHAIN_PREVNAME: |
| if ( GetPrev() ) |
| aRet = GetPrev()->GetName(); |
| break; |
| case MID_CHAIN_NEXTNAME: |
| if ( GetNext() ) |
| aRet = GetNext()->GetName(); |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| rVal <<= OUString(aRet); |
| return bRet; |
| } |
| |
| |
| |
| |
| //class SwFmtLineNumber |
| |
| SwFmtLineNumber::SwFmtLineNumber() : |
| SfxPoolItem( RES_LINENUMBER ) |
| { |
| nStartValue = 0; |
| bCountLines = sal_True; |
| } |
| |
| SwFmtLineNumber::~SwFmtLineNumber() |
| { |
| } |
| |
| int SwFmtLineNumber::operator==( const SfxPoolItem &rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| |
| return nStartValue == ((SwFmtLineNumber&)rAttr).GetStartValue() && |
| bCountLines == ((SwFmtLineNumber&)rAttr).IsCount(); |
| } |
| |
| SfxPoolItem* SwFmtLineNumber::Clone( SfxItemPool* ) const |
| { |
| return new SwFmtLineNumber( *this ); |
| } |
| |
| sal_Bool SwFmtLineNumber::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_LINENUMBER_COUNT: |
| { |
| sal_Bool bTmp = IsCount(); |
| rVal.setValue(&bTmp, ::getBooleanCppuType()); |
| } |
| break; |
| case MID_LINENUMBER_STARTVALUE: |
| rVal <<= (sal_Int32)GetStartValue(); |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| sal_Bool SwFmtLineNumber::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| // hier wird immer konvertiert! |
| nMemberId &= ~CONVERT_TWIPS; |
| sal_Bool bRet = sal_True; |
| switch ( nMemberId ) |
| { |
| case MID_LINENUMBER_COUNT: |
| SetCountLines( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_LINENUMBER_STARTVALUE: |
| { |
| sal_Int32 nVal = 0; |
| if(rVal >>= nVal) |
| SetStartValue( nVal ); |
| else |
| bRet = sal_False; |
| } |
| break; |
| default: |
| ASSERT( !this, "unknown MemberId" ); |
| bRet = sal_False; |
| } |
| return bRet; |
| } |
| |
| /************************************************************************* |
| * class SwTextGridItem |
| *************************************************************************/ |
| |
| SwTextGridItem::SwTextGridItem() |
| : SfxPoolItem( RES_TEXTGRID ), aColor( COL_LIGHTGRAY ), nLines( 20 ), |
| nBaseHeight( 400 ), nRubyHeight( 200 ), eGridType( GRID_NONE ), |
| bRubyTextBelow( 0 ), bPrintGrid( 1 ), bDisplayGrid( 1 ), |
| nBaseWidth(400), bSnapToChars( 1 ), bSquaredMode(1) |
| { |
| } |
| |
| SwTextGridItem::~SwTextGridItem() |
| { |
| } |
| |
| int SwTextGridItem::operator==( const SfxPoolItem& rAttr ) const |
| { |
| ASSERT( SfxPoolItem::operator==( rAttr ), "keine gleichen Attribute" ); |
| return eGridType == ((SwTextGridItem&)rAttr).GetGridType() && |
| nLines == ((SwTextGridItem&)rAttr).GetLines() && |
| nBaseHeight == ((SwTextGridItem&)rAttr).GetBaseHeight() && |
| nRubyHeight == ((SwTextGridItem&)rAttr).GetRubyHeight() && |
| bRubyTextBelow == ((SwTextGridItem&)rAttr).GetRubyTextBelow() && |
| bDisplayGrid == ((SwTextGridItem&)rAttr).GetDisplayGrid() && |
| bPrintGrid == ((SwTextGridItem&)rAttr).GetPrintGrid() && |
| aColor == ((SwTextGridItem&)rAttr).GetColor() && |
| nBaseWidth == ((SwTextGridItem&)rAttr).GetBaseWidth() && |
| bSnapToChars == ((SwTextGridItem&)rAttr).GetSnapToChars() && |
| bSquaredMode == ((SwTextGridItem&)rAttr).GetSquaredMode(); |
| } |
| |
| SfxPoolItem* SwTextGridItem::Clone( SfxItemPool* ) const |
| { |
| return new SwTextGridItem( *this ); |
| } |
| |
| SwTextGridItem& SwTextGridItem::operator=( const SwTextGridItem& rCpy ) |
| { |
| aColor = rCpy.GetColor(); |
| nLines = rCpy.GetLines(); |
| nBaseHeight = rCpy.GetBaseHeight(); |
| nRubyHeight = rCpy.GetRubyHeight(); |
| eGridType = rCpy.GetGridType(); |
| bRubyTextBelow = rCpy.GetRubyTextBelow(); |
| bPrintGrid = rCpy.GetPrintGrid(); |
| bDisplayGrid = rCpy.GetDisplayGrid(); |
| nBaseWidth = rCpy.GetBaseWidth(); |
| bSnapToChars = rCpy.GetSnapToChars(); |
| bSquaredMode = rCpy.GetSquaredMode(); |
| |
| return *this; |
| } |
| |
| sal_Bool SwTextGridItem::QueryValue( uno::Any& rVal, sal_uInt8 nMemberId ) const |
| { |
| sal_Bool bRet = sal_True; |
| |
| switch( nMemberId & ~CONVERT_TWIPS ) |
| { |
| case MID_GRID_COLOR: |
| rVal <<= GetColor().GetColor(); |
| break; |
| case MID_GRID_LINES: |
| rVal <<= GetLines(); |
| break; |
| case MID_GRID_RUBY_BELOW: |
| rVal.setValue( &bRubyTextBelow, ::getBooleanCppuType() ); |
| break; |
| case MID_GRID_PRINT: |
| rVal.setValue( &bPrintGrid, ::getBooleanCppuType() ); |
| break; |
| case MID_GRID_DISPLAY: |
| rVal.setValue( &bDisplayGrid, ::getBooleanCppuType() ); |
| break; |
| case MID_GRID_BASEHEIGHT: |
| DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0, |
| "This value needs TWIPS-MM100 conversion" ); |
| rVal <<= (sal_Int32) TWIP_TO_MM100_UNSIGNED(nBaseHeight); |
| break; |
| case MID_GRID_BASEWIDTH: |
| DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0, |
| "This value needs TWIPS-MM100 conversion" ); |
| rVal <<= (sal_Int32) TWIP_TO_MM100_UNSIGNED(nBaseWidth); |
| break; |
| case MID_GRID_RUBYHEIGHT: |
| DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0, |
| "This value needs TWIPS-MM100 conversion" ); |
| rVal <<= (sal_Int32)TWIP_TO_MM100_UNSIGNED(nRubyHeight); |
| break; |
| case MID_GRID_TYPE: |
| switch( GetGridType() ) |
| { |
| case GRID_NONE: |
| rVal <<= text::TextGridMode::NONE; |
| break; |
| case GRID_LINES_ONLY: |
| rVal <<= text::TextGridMode::LINES; |
| break; |
| case GRID_LINES_CHARS: |
| rVal <<= text::TextGridMode::LINES_AND_CHARS; |
| break; |
| default: |
| DBG_ERROR("unknown SwTextGrid value"); |
| bRet = sal_False; |
| break; |
| } |
| break; |
| case MID_GRID_SNAPTOCHARS: |
| rVal.setValue( &bSnapToChars, ::getBooleanCppuType() ); |
| break; |
| case MID_GRID_STANDARD_MODE: |
| { |
| sal_Bool bStandardMode = !bSquaredMode; |
| rVal.setValue( &bStandardMode, ::getBooleanCppuType() ); |
| } |
| break; |
| default: |
| DBG_ERROR("Unknown SwTextGridItem member"); |
| bRet = sal_False; |
| break; |
| } |
| |
| return bRet; |
| } |
| |
| sal_Bool SwTextGridItem::PutValue( const uno::Any& rVal, sal_uInt8 nMemberId ) |
| { |
| sal_Bool bRet = sal_True; |
| switch( nMemberId & ~CONVERT_TWIPS ) |
| { |
| case MID_GRID_COLOR: |
| { |
| sal_Int32 nTmp = 0; |
| bRet = (rVal >>= nTmp); |
| if( bRet ) |
| SetColor( Color(nTmp) ); |
| } |
| break; |
| case MID_GRID_LINES: |
| { |
| sal_Int16 nTmp = 0; |
| bRet = (rVal >>= nTmp); |
| if( bRet && (nTmp >= 0) ) |
| SetLines( (sal_uInt16)nTmp ); |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_GRID_RUBY_BELOW: |
| SetRubyTextBelow( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_GRID_PRINT: |
| SetPrintGrid( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_GRID_DISPLAY: |
| SetDisplayGrid( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_GRID_BASEHEIGHT: |
| case MID_GRID_BASEWIDTH: |
| case MID_GRID_RUBYHEIGHT: |
| { |
| DBG_ASSERT( (nMemberId & CONVERT_TWIPS) != 0, |
| "This value needs TWIPS-MM100 conversion" ); |
| sal_Int32 nTmp = 0; |
| bRet = (rVal >>= nTmp); |
| nTmp = MM100_TO_TWIP( nTmp ); |
| if( bRet && (nTmp >= 0) && ( nTmp <= USHRT_MAX) ) |
| if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEHEIGHT ) |
| SetBaseHeight( (sal_uInt16)nTmp ); |
| else if( (nMemberId & ~CONVERT_TWIPS) == MID_GRID_BASEWIDTH ) |
| SetBaseWidth( (sal_uInt16)nTmp ); |
| else |
| SetRubyHeight( (sal_uInt16)nTmp ); |
| else |
| bRet = sal_False; |
| } |
| break; |
| case MID_GRID_TYPE: |
| { |
| sal_Int16 nTmp = 0; |
| bRet = (rVal >>= nTmp); |
| if( bRet ) |
| { |
| switch( nTmp ) |
| { |
| case text::TextGridMode::NONE: |
| SetGridType( GRID_NONE ); |
| break; |
| case text::TextGridMode::LINES: |
| SetGridType( GRID_LINES_ONLY ); |
| break; |
| case text::TextGridMode::LINES_AND_CHARS: |
| SetGridType( GRID_LINES_CHARS ); |
| break; |
| default: |
| bRet = sal_False; |
| break; |
| } |
| } |
| break; |
| } |
| case MID_GRID_SNAPTOCHARS: |
| SetSnapToChars( *(sal_Bool*)rVal.getValue() ); |
| break; |
| case MID_GRID_STANDARD_MODE: |
| { |
| sal_Bool bStandard = *(sal_Bool*)rVal.getValue(); |
| SetSquaredMode( !bStandard ); |
| break; |
| } |
| default: |
| DBG_ERROR("Unknown SwTextGridItem member"); |
| bRet = sal_False; |
| } |
| |
| return bRet; |
| } |
| |
| void SwTextGridItem::SwitchPaperMode(sal_Bool bNew) |
| { |
| if( bNew == bSquaredMode ) |
| { |
| //same paper mode, not switch |
| return; |
| } |
| |
| // use default value when grid is disable |
| if( eGridType == GRID_NONE ) |
| { |
| bSquaredMode = bNew; |
| Init(); |
| return; |
| } |
| |
| if( bSquaredMode ) |
| { |
| //switch from "squared mode" to "standard mode" |
| nBaseWidth = nBaseHeight; |
| nBaseHeight = nBaseHeight + nRubyHeight; |
| nRubyHeight = 0; |
| } |
| else |
| { |
| //switch from "standard mode" to "squared mode" |
| nRubyHeight = nBaseHeight/3; |
| nBaseHeight = nBaseHeight - nRubyHeight; |
| nBaseWidth = nBaseHeight; |
| } |
| bSquaredMode = !bSquaredMode; |
| } |
| |
| void SwTextGridItem::Init() |
| { |
| if( bSquaredMode ) |
| { |
| nLines = 20; |
| nBaseHeight = 400; |
| nRubyHeight = 200; |
| eGridType = GRID_NONE; |
| bRubyTextBelow = 0; |
| bPrintGrid = 1; |
| bDisplayGrid = 1; |
| bSnapToChars = 1; |
| nBaseWidth = 400; |
| } |
| else |
| { |
| nLines = 44; |
| nBaseHeight = 312; |
| nRubyHeight = 0; |
| eGridType = GRID_NONE; |
| bRubyTextBelow = 0; |
| bPrintGrid = 1; |
| bDisplayGrid = 1; |
| nBaseWidth = 210; |
| bSnapToChars = 1; |
| |
| //default grid type is line only in CJK env |
| //disable this function due to type area change |
| //if grid type change. |
| //if(SvtCJKOptions().IsAsianTypographyEnabled()) |
| //{ |
| // bDisplayGrid = 0; |
| // eGridType = GRID_LINES_ONLY; |
| //} |
| } |
| } |
| // class SwHeaderAndFooterEatSpacingItem |
| |
| SfxPoolItem* SwHeaderAndFooterEatSpacingItem::Clone( SfxItemPool* ) const |
| { |
| return new SwHeaderAndFooterEatSpacingItem( Which(), GetValue() ); |
| } |
| |
| |
| // class SwFrmFmt |
| // Implementierung teilweise inline im hxx |
| |
| TYPEINIT1( SwFrmFmt, SwFmt ); |
| IMPL_FIXEDMEMPOOL_NEWDEL_DLL( SwFrmFmt, 20, 20 ) |
| |
| void SwFrmFmt::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew ) |
| { |
| SwFmtHeader *pH = 0; |
| SwFmtFooter *pF = 0; |
| |
| sal_uInt16 nWhich = pNew ? pNew->Which() : 0; |
| |
| if( RES_ATTRSET_CHG == nWhich ) |
| { |
| ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState( |
| RES_HEADER, sal_False, (const SfxPoolItem**)&pH ); |
| ((SwAttrSetChg*)pNew)->GetChgSet()->GetItemState( |
| RES_FOOTER, sal_False, (const SfxPoolItem**)&pF ); |
| } |
| else if( RES_HEADER == nWhich ) |
| pH = (SwFmtHeader*)pNew; |
| else if( RES_FOOTER == nWhich ) |
| pF = (SwFmtFooter*)pNew; |
| |
| if( pH && pH->IsActive() && !pH->GetHeaderFmt() ) |
| { //Hat er keinen, mach ich ihm einen |
| SwFrmFmt *pFmt = GetDoc()->MakeLayoutFmt( RND_STD_HEADER, 0 ); |
| pH->RegisterToFormat( *pFmt ); |
| } |
| |
| if( pF && pF->IsActive() && !pF->GetFooterFmt() ) |
| { //Hat er keinen, mach ich ihm einen |
| SwFrmFmt *pFmt = GetDoc()->MakeLayoutFmt( RND_STD_FOOTER, 0 ); |
| pF->RegisterToFormat( *pFmt ); |
| } |
| |
| // MIB 24.3.98: Modify der Basisklasse muss immer gerufen werden, z.B. |
| // wegen RESET_FMTWRITTEN. |
| // if ( GetDepends() ) |
| SwFmt::Modify( pOld, pNew ); |
| |
| if (pOld && (RES_REMOVE_UNO_OBJECT == pOld->Which())) |
| { // invalidate cached uno object |
| SetXObject(uno::Reference<uno::XInterface>(0)); |
| } |
| } |
| |
| void SwFrmFmt::RegisterToFormat( SwFmt& rFmt ) |
| { |
| rFmt.Add( this ); |
| } |
| |
| //Vernichtet alle Frms, die in aDepend angemeldet sind. |
| |
| void SwFrmFmt::DelFrms() |
| { |
| SwIterator<SwFrm,SwFmt> aIter( *this ); |
| SwFrm * pLast = aIter.First(); |
| if( pLast ) |
| do { |
| pLast->Cut(); |
| delete pLast; |
| } while( 0 != ( pLast = aIter.Next() )); |
| } |
| |
| void SwFrmFmt::MakeFrms() |
| { |
| ASSERT( !this, "Sorry not implemented." ); |
| } |
| |
| |
| |
| SwRect SwFrmFmt::FindLayoutRect( const sal_Bool bPrtArea, const Point* pPoint, |
| const sal_Bool bCalcFrm ) const |
| { |
| SwRect aRet; |
| SwFrm *pFrm = 0; |
| if( ISA( SwSectionFmt ) ) |
| { |
| // dann den frame::Frame per Node2Layout besorgen |
| SwSectionNode* pSectNd = ((SwSectionFmt*)this)->GetSectionNode(); |
| if( pSectNd ) |
| { |
| SwNode2Layout aTmp( *pSectNd, pSectNd->GetIndex() - 1 ); |
| pFrm = aTmp.NextFrm(); |
| |
| if( pFrm && !pFrm->KnowsFormat(*this) ) |
| { |
| // die Section hat keinen eigenen frame::Frame, also falls |
| // jemand die tatsaechliche Groe?e braucht, so muss das |
| // noch implementier werden, in dem sich vom Ende noch |
| // der entsprechende frame::Frame besorgt wird. |
| // PROBLEM: was passiert bei SectionFrames, die auf unter- |
| // schiedlichen Seiten stehen?? |
| if( bPrtArea ) |
| aRet = pFrm->Prt(); |
| else |
| { |
| aRet = pFrm->Frm(); |
| --aRet.Pos().Y(); |
| } |
| pFrm = 0; // das Rect ist ja jetzt fertig |
| } |
| } |
| } |
| else |
| { |
| sal_uInt16 nFrmType = RES_FLYFRMFMT == Which() ? FRM_FLY : USHRT_MAX; |
| pFrm = ::GetFrmOfModify( 0, *(SwModify*)this, nFrmType, pPoint, |
| 0, bCalcFrm ); |
| } |
| |
| if( pFrm ) |
| { |
| if( bPrtArea ) |
| aRet = pFrm->Prt(); |
| else |
| aRet = pFrm->Frm(); |
| } |
| return aRet; |
| } |
| |
| SwContact* SwFrmFmt::FindContactObj() |
| { |
| return SwIterator<SwContact,SwFmt>::FirstElement( *this ); |
| } |
| |
| SdrObject* SwFrmFmt::FindSdrObject() |
| { |
| // --> OD 2005-01-06 #i30669# - use method <FindContactObj()> instead of |
| // duplicated code. |
| SwContact* pFoundContact = FindContactObj(); |
| return pFoundContact ? pFoundContact->GetMaster() : 0; |
| // <-- |
| } |
| |
| SdrObject* SwFrmFmt::FindRealSdrObject() |
| { |
| if( RES_FLYFRMFMT == Which() ) |
| { |
| Point aNullPt; |
| SwFlyFrm* pFly = (SwFlyFrm*)::GetFrmOfModify( 0, *this, FRM_FLY, |
| &aNullPt, 0, sal_False ); |
| return pFly ? pFly->GetVirtDrawObj() : 0; |
| } |
| return FindSdrObject(); |
| } |
| |
| |
| sal_Bool SwFrmFmt::IsLowerOf( const SwFrmFmt& rFmt ) const |
| { |
| //Auch eine Verkettung von Innen nach aussen oder von aussen |
| //nach innen ist nicht zulaessig. |
| SwFlyFrm *pSFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(*this); |
| if( pSFly ) |
| { |
| SwFlyFrm *pAskFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement(rFmt); |
| if( pAskFly ) |
| return pSFly->IsLowerOf( pAskFly ); |
| } |
| |
| // dann mal ueber die Node-Positionen versuchen |
| const SwFmtAnchor* pAnchor = &rFmt.GetAnchor(); |
| if ((FLY_AT_PAGE != pAnchor->GetAnchorId()) && pAnchor->GetCntntAnchor()) |
| { |
| const SwSpzFrmFmts& rFmts = *GetDoc()->GetSpzFrmFmts(); |
| const SwNode* pFlyNd = pAnchor->GetCntntAnchor()->nNode.GetNode(). |
| FindFlyStartNode(); |
| while( pFlyNd ) |
| { |
| // dann ueber den Anker nach oben "hangeln" |
| sal_uInt16 n; |
| for( n = 0; n < rFmts.Count(); ++n ) |
| { |
| const SwFrmFmt* pFmt = rFmts[ n ]; |
| const SwNodeIndex* pIdx = pFmt->GetCntnt().GetCntntIdx(); |
| if( pIdx && pFlyNd == &pIdx->GetNode() ) |
| { |
| if( pFmt == this ) |
| return sal_True; |
| |
| pAnchor = &pFmt->GetAnchor(); |
| if ((FLY_AT_PAGE == pAnchor->GetAnchorId()) || |
| !pAnchor->GetCntntAnchor() ) |
| { |
| return sal_False; |
| } |
| |
| pFlyNd = pAnchor->GetCntntAnchor()->nNode.GetNode(). |
| FindFlyStartNode(); |
| break; |
| } |
| } |
| if( n >= rFmts.Count() ) |
| { |
| ASSERT( !this, "Fly-Section aber kein Format gefunden" ); |
| return sal_False; |
| } |
| } |
| } |
| return sal_False; |
| } |
| |
| // --> OD 2004-07-27 #i31698# |
| SwFrmFmt::tLayoutDir SwFrmFmt::GetLayoutDir() const |
| { |
| return SwFrmFmt::HORI_L2R; |
| } |
| |
| void SwFrmFmt::SetLayoutDir( const SwFrmFmt::tLayoutDir ) |
| { |
| // empty body, because default implementation does nothing |
| } |
| // <-- |
| |
| // --> OD 2004-08-06 #i28749# |
| sal_Int16 SwFrmFmt::GetPositionLayoutDir() const |
| { |
| return text::PositionLayoutDir::PositionInLayoutDirOfAnchor; |
| } |
| void SwFrmFmt::SetPositionLayoutDir( const sal_Int16 ) |
| { |
| // empty body, because default implementation does nothing |
| } |
| // <-- |
| String SwFrmFmt::GetDescription() const |
| { |
| return SW_RES(STR_FRAME); |
| } |
| |
| // class SwFlyFrmFmt |
| // Implementierung teilweise inline im hxx |
| |
| TYPEINIT1( SwFlyFrmFmt, SwFrmFmt ); |
| IMPL_FIXEDMEMPOOL_NEWDEL( SwFlyFrmFmt, 10, 10 ) |
| |
| SwFlyFrmFmt::~SwFlyFrmFmt() |
| { |
| SwIterator<SwFlyFrm,SwFmt> aIter( *this ); |
| SwFlyFrm * pLast = aIter.First(); |
| if( pLast ) |
| do { |
| delete pLast; |
| } while( 0 != ( pLast = aIter.Next() )); |
| |
| SwIterator<SwFlyDrawContact,SwFmt> a2ndIter( *this ); |
| SwFlyDrawContact* pC = a2ndIter.First(); |
| if( pC ) |
| do { |
| delete pC; |
| |
| } while( 0 != ( pC = a2ndIter.Next() )); |
| } |
| |
| //Erzeugen der Frms wenn das Format einen Absatzgebundenen Rahmen beschreibt. |
| //MA: 14. Feb. 94, Erzeugen der Frms auch fuer Seitengebundene Rahmen. |
| |
| void SwFlyFrmFmt::MakeFrms() |
| { |
| // gibts ueberhaupt ein Layout ?? |
| if( !GetDoc()->GetCurrentViewShell() ) |
| return; //swmod 071108//swmod 071225 |
| |
| SwModify *pModify = 0; |
| // OD 24.07.2003 #111032# - create local copy of anchor attribute for possible changes. |
| SwFmtAnchor aAnchorAttr( GetAnchor() ); |
| switch( aAnchorAttr.GetAnchorId() ) |
| { |
| case FLY_AS_CHAR: |
| case FLY_AT_PARA: |
| case FLY_AT_CHAR: |
| if( aAnchorAttr.GetCntntAnchor() ) |
| { |
| pModify = aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode(); |
| } |
| break; |
| |
| case FLY_AT_FLY: |
| if( aAnchorAttr.GetCntntAnchor() ) |
| { |
| //Erst einmal ueber den Inhalt suchen, weil konstant schnell. Kann |
| //Bei verketteten Rahmen aber auch schief gehen, weil dann evtl. |
| //niemals ein frame::Frame zu dem Inhalt existiert. Dann muss leider noch |
| //die Suche vom StartNode zum FrameFormat sein. |
| SwNodeIndex aIdx( aAnchorAttr.GetCntntAnchor()->nNode ); |
| SwCntntNode *pCNd = GetDoc()->GetNodes().GoNext( &aIdx ); |
| // --> OD 2009-12-28 #i105535# |
| if ( pCNd == 0 ) |
| { |
| pCNd = aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode(); |
| } |
| if ( pCNd ) |
| // <-- |
| { |
| if( SwIterator<SwFrm,SwCntntNode>::FirstElement( *pCNd ) ) |
| { |
| pModify = pCNd; |
| } |
| } |
| // --> OD 2009-12-28 #i105535# |
| if ( pModify == 0 ) |
| // <-- |
| { |
| const SwNodeIndex &rIdx = aAnchorAttr.GetCntntAnchor()->nNode; |
| SwSpzFrmFmts& rFmts = *GetDoc()->GetSpzFrmFmts(); |
| for( sal_uInt16 i = 0; i < rFmts.Count(); ++i ) |
| { |
| SwFrmFmt* pFlyFmt = rFmts[i]; |
| if( pFlyFmt->GetCntnt().GetCntntIdx() && |
| rIdx == *pFlyFmt->GetCntnt().GetCntntIdx() ) |
| { |
| pModify = pFlyFmt; |
| break; |
| } |
| } |
| } |
| } |
| break; |
| |
| case FLY_AT_PAGE: |
| { |
| sal_uInt16 nPgNum = aAnchorAttr.GetPageNum(); |
| SwPageFrm *pPage = (SwPageFrm*)GetDoc()->GetCurrentLayout()->Lower(); //swmod 080218 |
| if( nPgNum == 0 && aAnchorAttr.GetCntntAnchor() ) |
| { |
| SwCntntNode *pCNd = aAnchorAttr.GetCntntAnchor()->nNode.GetNode().GetCntntNode(); |
| SwIterator<SwFrm,SwCntntNode> aIter( *pCNd ); |
| for ( SwFrm* pFrm = aIter.First(); pFrm != NULL; pFrm = aIter.Next() ) |
| { |
| pPage = pFrm->FindPageFrm(); |
| if( pPage ) |
| { |
| nPgNum = pPage->GetPhyPageNum(); |
| aAnchorAttr.SetPageNum( nPgNum ); |
| aAnchorAttr.SetAnchor( 0 ); |
| SetFmtAttr( aAnchorAttr ); |
| break; |
| } |
| } |
| } |
| while ( pPage ) |
| { |
| if ( pPage->GetPhyPageNum() == nPgNum ) |
| { |
| pPage->PlaceFly( 0, this ); |
| break; |
| } |
| pPage = (SwPageFrm*)pPage->GetNext(); |
| } |
| } |
| break; |
| default: |
| break; |
| } |
| |
| if( pModify ) |
| { |
| SwIterator<SwFrm,SwModify> aIter( *pModify ); |
| for( SwFrm *pFrm = aIter.First(); pFrm; pFrm = aIter.Next() ) |
| { |
| sal_Bool bAdd = !pFrm->IsCntntFrm() || |
| !((SwCntntFrm*)pFrm)->IsFollow(); |
| |
| if ( FLY_AT_FLY == aAnchorAttr.GetAnchorId() && !pFrm->IsFlyFrm() ) |
| { |
| // --> OD 2009-12-28 #i105535# |
| // fallback to anchor type at-paragraph, if no fly frame is found. |
| // pFrm = pFrm->FindFlyFrm(); |
| SwFrm* pFlyFrm = pFrm->FindFlyFrm(); |
| if ( pFlyFrm ) |
| { |
| pFrm = pFlyFrm; |
| } |
| else |
| { |
| aAnchorAttr.SetType( FLY_AT_PARA ); |
| SetFmtAttr( aAnchorAttr ); |
| MakeFrms(); |
| return; |
| } |
| // <-- |
| } |
| |
| if( pFrm->GetDrawObjs() ) |
| { |
| // --> OD 2004-07-01 #i28701# - new type <SwSortedObjs> |
| SwSortedObjs &rObjs = *pFrm->GetDrawObjs(); |
| for( sal_uInt16 i = 0; i < rObjs.Count(); ++i) |
| { |
| // --> OD 2004-07-01 #i28701# - consider changed type of |
| // <SwSortedObjs> entries. |
| SwAnchoredObject* pObj = rObjs[i]; |
| if( pObj->ISA(SwFlyFrm) && |
| (&pObj->GetFrmFmt()) == this ) |
| { |
| bAdd = sal_False; |
| break; |
| } |
| } |
| } |
| |
| if( bAdd ) |
| { |
| SwFlyFrm *pFly = 0; |
| switch( aAnchorAttr.GetAnchorId() ) |
| { |
| case FLY_AT_FLY: |
| pFly = new SwFlyLayFrm( this, pFrm, pFrm ); |
| break; |
| |
| case FLY_AT_PARA: |
| case FLY_AT_CHAR: |
| pFly = new SwFlyAtCntFrm( this, pFrm, pFrm ); |
| break; |
| |
| case FLY_AS_CHAR: |
| pFly = new SwFlyInCntFrm( this, pFrm, pFrm ); |
| break; |
| default: |
| ASSERT( !this, "Neuer Ankertyp" ) |
| break; |
| } |
| pFrm->AppendFly( pFly ); |
| SwPageFrm *pPage = pFly->FindPageFrm(); |
| if( pPage ) |
| ::RegistFlys( pPage, pFly ); |
| } |
| } |
| } |
| } |
| |
| SwFlyFrm* SwFlyFrmFmt::GetFrm( const Point* pPoint, const sal_Bool bCalcFrm ) const |
| { |
| return (SwFlyFrm*)::GetFrmOfModify( 0, *(SwModify*)this, FRM_FLY, |
| pPoint, 0, bCalcFrm ); |
| } |
| |
| SwAnchoredObject* SwFlyFrmFmt::GetAnchoredObj( const Point* pPoint, const sal_Bool bCalcFrm ) const |
| { |
| SwFlyFrm* pFlyFrm( GetFrm( pPoint, bCalcFrm ) ); |
| if ( pFlyFrm ) |
| { |
| return dynamic_cast<SwAnchoredObject*>(pFlyFrm); |
| } |
| else |
| { |
| return 0L; |
| } |
| } |
| |
| |
| sal_Bool SwFlyFrmFmt::GetInfo( SfxPoolItem& rInfo ) const |
| { |
| sal_Bool bRet = sal_True; |
| switch( rInfo.Which() ) |
| { |
| case RES_CONTENT_VISIBLE: |
| { |
| ((SwPtrMsgPoolItem&)rInfo).pObject = SwIterator<SwFrm,SwFmt>::FirstElement( *this ); |
| } |
| bRet = sal_False; |
| break; |
| |
| default: |
| bRet = SwFrmFmt::GetInfo( rInfo ); |
| break; |
| } |
| return bRet; |
| } |
| |
| // --> OD 2009-07-14 #i73249# |
| void SwFlyFrmFmt::SetObjTitle( const String& rTitle, bool bBroadcast ) |
| { |
| SdrObject* pMasterObject = FindSdrObject(); |
| ASSERT( pMasterObject, |
| "<SwNoTxtNode::SetObjTitle(..)> - missing <SdrObject> instance" ); |
| if ( !pMasterObject ) |
| { |
| return; |
| } |
| |
| if( bBroadcast ) |
| { |
| SwStringMsgPoolItem aOld( RES_TITLE_CHANGED, pMasterObject->GetTitle() ); |
| SwStringMsgPoolItem aNew( RES_TITLE_CHANGED, rTitle ); |
| pMasterObject->SetTitle( rTitle ); |
| ModifyNotification( &aOld, &aNew ); |
| } |
| else |
| { |
| pMasterObject->SetTitle( rTitle ); |
| } |
| } |
| |
| const String SwFlyFrmFmt::GetObjTitle() const |
| { |
| const SdrObject* pMasterObject = FindSdrObject(); |
| ASSERT( pMasterObject, |
| "<SwFlyFrmFmt::GetObjTitle(..)> - missing <SdrObject> instance" ); |
| if ( !pMasterObject ) |
| { |
| return aEmptyStr; |
| } |
| |
| return pMasterObject->GetTitle(); |
| } |
| |
| void SwFlyFrmFmt::SetObjDescription( const String& rDescription, bool bBroadcast ) |
| { |
| SdrObject* pMasterObject = FindSdrObject(); |
| ASSERT( pMasterObject, |
| "<SwFlyFrmFmt::SetDescription(..)> - missing <SdrObject> instance" ); |
| if ( !pMasterObject ) |
| { |
| return; |
| } |
| |
| if( bBroadcast ) |
| { |
| SwStringMsgPoolItem aOld( RES_DESCRIPTION_CHANGED, pMasterObject->GetDescription() ); |
| SwStringMsgPoolItem aNew( RES_DESCRIPTION_CHANGED, rDescription ); |
| pMasterObject->SetDescription( rDescription ); |
| ModifyNotification( &aOld, &aNew ); |
| } |
| else |
| { |
| pMasterObject->SetDescription( rDescription ); |
| } |
| } |
| |
| const String SwFlyFrmFmt::GetObjDescription() const |
| { |
| const SdrObject* pMasterObject = FindSdrObject(); |
| ASSERT( pMasterObject, |
| "<SwNoTxtNode::GetDescription(..)> - missing <SdrObject> instance" ); |
| if ( !pMasterObject ) |
| { |
| return aEmptyStr; |
| } |
| |
| return pMasterObject->GetDescription(); |
| } |
| // <-- |
| |
| /** SwFlyFrmFmt::IsBackgroundTransparent - for #99657# |
| |
| OD 22.08.2002 - overloading virtual method and its default implementation, |
| because format of fly frame provides transparent backgrounds. |
| Method determines, if background of fly frame is transparent. |
| |
| @author OD |
| |
| @return true, if background color is transparent, but not "no fill" |
| or the transparency of a existing background graphic is set. |
| */ |
| sal_Bool SwFlyFrmFmt::IsBackgroundTransparent() const |
| { |
| sal_Bool bReturn = sal_False; |
| |
| /// NOTE: If background color is "no fill"/"auto fill" (COL_TRANSPARENT) |
| /// and there is no background graphic, it "inherites" the background |
| /// from its anchor. |
| if ( (GetBackground().GetColor().GetTransparency() != 0) && |
| (GetBackground().GetColor() != COL_TRANSPARENT) |
| ) |
| { |
| bReturn = sal_True; |
| } |
| else |
| { |
| const GraphicObject *pTmpGrf = |
| static_cast<const GraphicObject*>(GetBackground().GetGraphicObject()); |
| if ( (pTmpGrf) && |
| (pTmpGrf->GetAttr().GetTransparency() != 0) |
| ) |
| { |
| bReturn = sal_True; |
| } |
| } |
| |
| return bReturn; |
| } |
| |
| /** SwFlyFrmFmt::IsBackgroundBrushInherited - for #103898# |
| |
| OD 08.10.2002 - method to determine, if the brush for drawing the |
| background is "inherited" from its parent/grandparent. |
| This is the case, if no background graphic is set and the background |
| color is "no fill"/"auto fill" |
| NOTE: condition is "copied" from method <SwFrm::GetBackgroundBrush(..). |
| |
| @author OD |
| |
| @return true, if background brush is "inherited" from parent/grandparent |
| */ |
| sal_Bool SwFlyFrmFmt::IsBackgroundBrushInherited() const |
| { |
| sal_Bool bReturn = sal_False; |
| |
| if ( (GetBackground().GetColor() == COL_TRANSPARENT) && |
| !(GetBackground().GetGraphicObject()) ) |
| { |
| bReturn = sal_True; |
| } |
| |
| return bReturn; |
| } |
| |
| // --> OD 2006-02-28 #125892# |
| SwHandleAnchorNodeChg::SwHandleAnchorNodeChg( SwFlyFrmFmt& _rFlyFrmFmt, |
| const SwFmtAnchor& _rNewAnchorFmt, |
| SwFlyFrm* _pKeepThisFlyFrm ) |
| : mrFlyFrmFmt( _rFlyFrmFmt ), |
| mbAnchorNodeChanged( false ) |
| { |
| const RndStdIds nNewAnchorType( _rNewAnchorFmt.GetAnchorId() ); |
| if ( ((nNewAnchorType == FLY_AT_PARA) || |
| (nNewAnchorType == FLY_AT_CHAR)) && |
| _rNewAnchorFmt.GetCntntAnchor() && |
| _rNewAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode() ) |
| { |
| const SwFmtAnchor& aOldAnchorFmt( _rFlyFrmFmt.GetAnchor() ); |
| if ( aOldAnchorFmt.GetAnchorId() == nNewAnchorType && |
| aOldAnchorFmt.GetCntntAnchor() && |
| aOldAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode() && |
| aOldAnchorFmt.GetCntntAnchor()->nNode != |
| _rNewAnchorFmt.GetCntntAnchor()->nNode ) |
| { |
| // determine 'old' number of anchor frames |
| sal_uInt32 nOldNumOfAnchFrm( 0L ); |
| SwIterator<SwFrm,SwCntntNode> aOldIter( *(aOldAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) ); |
| for( SwFrm* pOld = aOldIter.First(); pOld; pOld = aOldIter.Next() ) |
| { |
| ++nOldNumOfAnchFrm; |
| } |
| // determine 'new' number of anchor frames |
| sal_uInt32 nNewNumOfAnchFrm( 0L ); |
| SwIterator<SwFrm,SwCntntNode> aNewIter( *(_rNewAnchorFmt.GetCntntAnchor()->nNode.GetNode().GetCntntNode()) ); |
| for( SwFrm* pNew = aNewIter.First(); pNew; pNew = aNewIter.Next() ) |
| { |
| ++nNewNumOfAnchFrm; |
| } |
| if ( nOldNumOfAnchFrm != nNewNumOfAnchFrm ) |
| { |
| // delete existing fly frames except <_pKeepThisFlyFrm> |
| SwIterator<SwFrm,SwFmt> aIter( mrFlyFrmFmt ); |
| SwFrm* pFrm = aIter.First(); |
| if ( pFrm ) |
| { |
| do { |
| if ( pFrm != _pKeepThisFlyFrm ) |
| { |
| pFrm->Cut(); |
| delete pFrm; |
| } |
| } while( 0 != ( pFrm = aIter.Next() )); |
| } |
| // indicate, that re-creation of fly frames necessary |
| mbAnchorNodeChanged = true; |
| } |
| } |
| } |
| } |
| |
| SwHandleAnchorNodeChg::~SwHandleAnchorNodeChg() |
| { |
| if ( mbAnchorNodeChanged ) |
| { |
| mrFlyFrmFmt.MakeFrms(); |
| } |
| } |
| // <-- |
| // class SwDrawFrmFmt |
| // Implementierung teilweise inline im hxx |
| |
| TYPEINIT1( SwDrawFrmFmt, SwFrmFmt ); |
| IMPL_FIXEDMEMPOOL_NEWDEL( SwDrawFrmFmt, 10, 10 ) |
| |
| SwDrawFrmFmt::~SwDrawFrmFmt() |
| { |
| SwContact *pContact = FindContactObj(); |
| delete pContact; |
| } |
| |
| void SwDrawFrmFmt::MakeFrms() |
| { |
| SwDrawContact *pContact = (SwDrawContact*)FindContactObj(); |
| if ( pContact ) |
| pContact->ConnectToLayout(); |
| } |
| |
| void SwDrawFrmFmt::DelFrms() |
| { |
| SwDrawContact *pContact = (SwDrawContact *)FindContactObj(); |
| if ( pContact ) //fuer den Reader und andere Unabwaegbarkeiten. |
| pContact->DisconnectFromLayout(); |
| } |
| |
| // --> OD 2004-07-27 #i31698# |
| SwFrmFmt::tLayoutDir SwDrawFrmFmt::GetLayoutDir() const |
| { |
| return meLayoutDir; |
| } |
| |
| void SwDrawFrmFmt::SetLayoutDir( const SwFrmFmt::tLayoutDir _eLayoutDir ) |
| { |
| meLayoutDir = _eLayoutDir; |
| } |
| // <-- |
| |
| // --> OD 2004-08-06 #i28749# |
| sal_Int16 SwDrawFrmFmt::GetPositionLayoutDir() const |
| { |
| return mnPositionLayoutDir; |
| } |
| void SwDrawFrmFmt::SetPositionLayoutDir( const sal_Int16 _nPositionLayoutDir ) |
| { |
| switch ( _nPositionLayoutDir ) |
| { |
| case text::PositionLayoutDir::PositionInHoriL2R: |
| case text::PositionLayoutDir::PositionInLayoutDirOfAnchor: |
| { |
| mnPositionLayoutDir = _nPositionLayoutDir; |
| } |
| break; |
| default: |
| { |
| ASSERT( false, |
| "<SwDrawFrmFmt::SetPositionLayoutDir(..)> - invalid attribute value." ); |
| } |
| } |
| } |
| // <-- |
| |
| String SwDrawFrmFmt::GetDescription() const |
| { |
| String aResult; |
| const SdrObject * pSdrObj = FindSdrObject(); |
| |
| if (pSdrObj) |
| { |
| if (pSdrObj != pSdrObjCached) |
| { |
| SdrObject * pSdrObjCopy = pSdrObj->Clone(); |
| SdrUndoNewObj * pSdrUndo = new SdrUndoNewObj(*pSdrObjCopy); |
| sSdrObjCachedComment = pSdrUndo->GetComment(); |
| |
| delete pSdrUndo; |
| |
| pSdrObjCached = pSdrObj; |
| } |
| |
| aResult = sSdrObjCachedComment; |
| } |
| else |
| aResult = SW_RES(STR_GRAPHIC); |
| |
| return aResult; |
| } |
| |
| IMapObject* SwFrmFmt::GetIMapObject( const Point& rPoint, |
| const SwFlyFrm *pFly ) const |
| { |
| const SwFmtURL &rURL = GetURL(); |
| if( !rURL.GetMap() ) |
| return 0; |
| |
| if( !pFly ) |
| { |
| pFly = SwIterator<SwFlyFrm,SwFmt>::FirstElement( *this ); |
| if( !pFly ) |
| return 0; |
| } |
| |
| //Orignialgroesse fuer OLE und Grafik ist die TwipSize, |
| //ansonsten die Groesse vom FrmFmt des Fly. |
| const SwFrm *pRef; |
| SwNoTxtNode *pNd = 0; |
| Size aOrigSz; |
| if( pFly->Lower() && pFly->Lower()->IsNoTxtFrm() ) |
| { |
| pRef = pFly->Lower(); |
| pNd = ((SwCntntFrm*)pRef)->GetNode()->GetNoTxtNode(); |
| aOrigSz = pNd->GetTwipSize(); |
| } |
| else |
| { |
| pRef = pFly; |
| aOrigSz = pFly->GetFmt()->GetFrmSize().GetSize(); |
| } |
| |
| if( aOrigSz.Width() != 0 && aOrigSz.Height() != 0 ) |
| { |
| Point aPos( rPoint ); |
| Size aActSz ( pRef == pFly ? pFly->Frm().SSize() : pRef->Prt().SSize() ); |
| const MapMode aSrc ( MAP_TWIP ); |
| const MapMode aDest( MAP_100TH_MM ); |
| aOrigSz = OutputDevice::LogicToLogic( aOrigSz, aSrc, aDest ); |
| aActSz = OutputDevice::LogicToLogic( aActSz, aSrc, aDest ); |
| aPos -= pRef->Frm().Pos(); |
| aPos -= pRef->Prt().Pos(); |
| aPos = OutputDevice::LogicToLogic( aPos, aSrc, aDest ); |
| sal_uInt32 nFlags = 0; |
| if ( pFly != pRef && pNd->IsGrfNode() ) |
| { |
| const sal_uInt16 nMirror = pNd->GetSwAttrSet(). |
| GetMirrorGrf().GetValue(); |
| if ( RES_MIRROR_GRAPH_BOTH == nMirror ) |
| nFlags = IMAP_MIRROR_HORZ | IMAP_MIRROR_VERT; |
| else if ( RES_MIRROR_GRAPH_VERT == nMirror ) |
| nFlags = IMAP_MIRROR_VERT; |
| else if ( RES_MIRROR_GRAPH_HOR == nMirror ) |
| nFlags = IMAP_MIRROR_HORZ; |
| |
| } |
| return ((ImageMap*)rURL.GetMap())->GetHitIMapObject( aOrigSz, |
| aActSz, aPos, nFlags ); |
| } |
| |
| return 0; |
| } |
| |
| sal_Bool SwFrmFmt::HasCaption() const |
| { |
| if(pCaptionFmt != NULL && pCaptionFmt->GetDepends()) |
| return sal_True; |
| return sal_False; |
| } |
| |
| void SwFrmFmt::SetCaptionFmt(SwFrmFmt * pFmt) |
| { |
| pCaptionFmt = pFmt; |
| } |
| |
| SwFrmFmt* SwFrmFmt::GetCaptionFmt() const |
| { |
| return pCaptionFmt; |
| } |