/************************************************************************* * * $RCSfile: unoshtxt.cxx,v $ * * $Revision: 1.25 $ * * last change: $Author: thb $ $Date: 2002-02-26 12:22:03 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ #pragma hdrstop #ifndef _SV_SVAPP_HXX #include #endif //#include //#include #include #ifndef _SFXLSTNER_HXX //autogen #include #endif #ifndef _RTL_REF_HXX_ #include #endif #ifndef _OSL_MUTEX_HXX_ #include #endif #ifndef _SFXHINT_HXX //autogen #include #endif #ifndef _SFXSTYLE_HXX #include #endif #ifndef _SVDMODEL_HXX //autogen #include #endif #ifndef _SVDOUTL_HXX //autogen #include #endif #ifndef _SVDOBJ_HXX #include #endif #ifndef _SVDVIEW_HXX #include #endif #ifndef _SVDETC_HXX #include #endif #ifndef _OUTLINER_HXX #include #endif #ifndef _SVX_UNOFOROU_HXX #include #endif #ifndef _SVX_UNOVIWOU_HXX #include #endif #ifndef _OUTLOBJ_HXX #include "outlobj.hxx" #endif #include "svdotext.hxx" #include "svdpage.hxx" #include "editeng.hxx" #ifndef _EDITOBJ_HXX #include "editobj.hxx" #endif #include "unotext.hxx" using namespace ::osl; using namespace ::vos; using namespace ::rtl; namespace css = ::com::sun::star; //------------------------------------------------------------------------ // SvxTextEditSourceImpl //------------------------------------------------------------------------ /** @descr

This class essentially provides the text and view forwarders. If no SdrView is given, this class handles the UNO objects, which are currently not concerned with view issues. In this case, GetViewForwarder() always returns NULL and the underlying EditEngine of the SvxTextForwarder is a background one (i.e. not the official DrawOutliner, but one created exclusively for this object, with no relation to a view).

If a SdrView is given at construction time, the caller is responsible for destroying this object when the view becomes invalid (the views cannot notify). If GetViewForwarder(sal_True) is called, the underlying shape is put into edit mode, the view forwarder returned encapsulates the OutlinerView and the next call to GetTextForwarder() yields a forwarder encapsulating the actual DrawOutliner. Thus, changes on that Outliner are immediately reflected on the screen. If the object leaves edit mode, the old behaviour is restored.

*/ class SvxTextEditSourceImpl : public SfxListener, public SfxBroadcaster { private: oslInterlockedCount maRefCount; SdrObject* mpObject; SdrView* mpView; const Window* mpWindow; SdrModel* mpModel; SdrOutliner* mpOutliner; SvxOutlinerForwarder* mpTextForwarder; SvxDrawOutlinerViewForwarder* mpViewForwarder; // if non-NULL, use GetEditModeTextForwarder text forwarder BOOL mbDataValid; BOOL mbDestroyed; BOOL mbIsLocked; BOOL mbNeedsUpdate; BOOL mbOldUndoMode; SvxTextForwarder* GetBackgroundTextForwarder(); SvxTextForwarder* GetEditModeTextForwarder(); SvxDrawOutlinerViewForwarder* CreateViewForwarder(); public: SvxTextEditSourceImpl( SdrObject* pObject ); SvxTextEditSourceImpl( SdrObject& rObject, SdrView& rView, const Window& rWindow ); ~SvxTextEditSourceImpl(); void SAL_CALL acquire(); void SAL_CALL release(); virtual void Notify( SfxBroadcaster& rBC, const SfxHint& rHint ); SvxEditSource* Clone() const; SvxTextForwarder* GetTextForwarder(); SvxEditViewForwarder* GetEditViewForwarder( sal_Bool ); void UpdateData(); SdrObject* GetSdrObject() const { return mpObject; } void lock(); void unlock(); BOOL IsValid() const; Rectangle GetVisArea() const; Point LogicToPixel( const Point& ) const; Point PixelToLogic( const Point& ) const; DECL_LINK( NotifyHdl, EENotify* ); }; //------------------------------------------------------------------------ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject* pObject ) : mpObject ( pObject ), mpModel ( pObject ? pObject->GetModel() : NULL ), mpView ( NULL ), mpWindow ( NULL ), mpOutliner ( NULL ), mpTextForwarder ( NULL ), mpViewForwarder ( NULL ), mbDataValid ( FALSE ), mbDestroyed ( FALSE ), mbIsLocked ( FALSE ), mbNeedsUpdate ( FALSE ), mbOldUndoMode ( FALSE ), maRefCount ( 0 ) { DBG_ASSERT( mpObject, "invalid pObject!" ); if( mpModel ) StartListening( *mpModel ); } //------------------------------------------------------------------------ SvxTextEditSourceImpl::SvxTextEditSourceImpl( SdrObject& rObject, SdrView& rView, const Window& rWindow ) : mpObject ( &rObject ), mpModel ( rObject.GetModel() ), mpView ( &rView ), mpWindow ( &rWindow ), mpOutliner ( NULL ), mpTextForwarder ( NULL ), mpViewForwarder ( NULL ), mbDataValid ( FALSE ), mbDestroyed ( FALSE ), mbIsLocked ( FALSE ), mbNeedsUpdate ( FALSE ), mbOldUndoMode ( FALSE ), maRefCount ( 0 ) { if( mpModel ) StartListening( *mpModel ); } //------------------------------------------------------------------------ SvxTextEditSourceImpl::~SvxTextEditSourceImpl() { DBG_ASSERT( mbIsLocked == sal_False, "text edit source was not unlocked before dispose!" ); if( mpModel ) EndListening( *mpModel ); delete mpTextForwarder; delete mpViewForwarder; if( mpOutliner ) { if( mpModel ) { mpModel->disposeOutliner( mpOutliner ); } else { delete mpOutliner; } } } //------------------------------------------------------------------------ void SAL_CALL SvxTextEditSourceImpl::acquire() { osl_incrementInterlockedCount( &maRefCount ); } //------------------------------------------------------------------------ void SAL_CALL SvxTextEditSourceImpl::release() { if( ! osl_decrementInterlockedCount( &maRefCount ) ) delete this; } //------------------------------------------------------------------------ void SvxTextEditSourceImpl::Notify( SfxBroadcaster& rBC, const SfxHint& rHint ) { const SdrHint* pSdrHint = PTR_CAST( SdrHint, &rHint ); if( pSdrHint ) { if( pSdrHint->GetKind() == HINT_OBJCHG ) { mbDataValid = FALSE; // Text muss neu geholt werden } else if( pSdrHint->GetKind() == HINT_OBJREMOVED ) { if( mpObject == pSdrHint->GetObject() ) { mbDestroyed = TRUE; } } else if( pSdrHint->GetKind() == HINT_MODELCLEARED ) { mbDestroyed = TRUE; } else if( pSdrHint->GetKind() == HINT_OBJLISTCLEAR ) { SdrObjList* pObjList = mpObject ? mpObject->GetObjList() : NULL; while( pObjList ) { if( pSdrHint->GetObjList() == pObjList ) { mbDestroyed = sal_True; break; } pObjList = pObjList->GetUpList(); } } } if( mbDestroyed ) { delete mpTextForwarder; mpTextForwarder = NULL; delete mpViewForwarder; mpViewForwarder = NULL; if( mpOutliner ) { if( mpModel ) { mpModel->disposeOutliner( mpOutliner ); } else { delete mpOutliner; } mpOutliner = NULL; } if( mpModel ) { EndListening( *mpModel ); mpModel = NULL; } mpObject = NULL; mpView = NULL; mpWindow = NULL; Broadcast( TextHint( SFX_HINT_DYING ) ); } } //------------------------------------------------------------------------ #ifndef _COM_SUN_STAR_LINGUISTIC2_XLINGUSERVICEMANAGER_HPP_ #include #endif #ifndef _COMPHELPER_PROCESSFACTORY_HXX_ #include #endif SvxTextForwarder* SvxTextEditSourceImpl::GetBackgroundTextForwarder() { if (!mpTextForwarder) { if( mpOutliner == NULL ) { SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject ); USHORT nOutlMode = OUTLINERMODE_TEXTOBJECT; if( pTextObj && pTextObj->IsTextFrame() && pTextObj->GetTextKind() == OBJ_OUTLINETEXT ) nOutlMode = OUTLINERMODE_OUTLINEOBJECT; mpOutliner = mpModel->createOutliner( nOutlMode ); mpOutliner->SetTextObjNoInit( pTextObj ); /* mpOutliner = SdrMakeOutliner( nOutlMode, pModel ); Outliner& aDrawOutliner = pModel->GetDrawOutliner(); mpOutliner->SetCalcFieldValueHdl( aDrawOutliner.GetCalcFieldValueHdl() ); */ if( mbIsLocked ) { ((EditEngine*)&(mpOutliner->GetEditEngine()))->SetUpdateMode( sal_False ); mbOldUndoMode = ((EditEngine*)&(mpOutliner->GetEditEngine()))->IsUndoEnabled(); ((EditEngine*)&(mpOutliner->GetEditEngine()))->EnableUndo( sal_False ); } // - css::uno::Reference< css::lang::XMultiServiceFactory > xMgr( ::comphelper::getProcessServiceFactory() ); css::uno::Reference< css::linguistic2::XLinguServiceManager > xLinguServiceManager( xMgr->createInstance( OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.linguistic2.LinguServiceManager" ))), css::uno::UNO_QUERY ); if ( xLinguServiceManager.is() ) { css::uno::Reference< css::linguistic2::XHyphenator > xHyphenator( xLinguServiceManager->getHyphenator(), css::uno::UNO_QUERY ); if( xHyphenator.is() ) mpOutliner->SetHyphenator( xHyphenator ); } // - } mpTextForwarder = new SvxOutlinerForwarder( *mpOutliner ); // register as listener - need to broadcast state change messages mpTextForwarder->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) ); } if( mpObject && !mbDataValid ) { mpTextForwarder->flushCache(); OutlinerParaObject* mpOutlinerParaObject = NULL; BOOL bTextEditActive = FALSE; SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject ); if( pTextObj ) mpOutlinerParaObject = pTextObj->GetEditOutlinerParaObject(); // Get the OutlinerParaObject if text edit is active if( mpOutlinerParaObject ) bTextEditActive = TRUE; // text edit active else mpOutlinerParaObject = mpObject->GetOutlinerParaObject(); if( mpOutlinerParaObject && ( bTextEditActive || !mpObject->IsEmptyPresObj() || mpObject->GetPage()->IsMasterPage() ) ) { mpOutliner->SetText( *mpOutlinerParaObject ); // #91254# put text to object and set EmptyPresObj to FALSE if( pTextObj && bTextEditActive && mpOutlinerParaObject && mpObject->IsEmptyPresObj() ) { mpObject->SetEmptyPresObj( FALSE ); pTextObj->SetOutlinerParaObject( mpOutlinerParaObject ); } } else { sal_Bool bVertical = mpOutlinerParaObject ? mpOutlinerParaObject->IsVertical() : sal_False; // set objects style sheet on empty outliner SfxStyleSheetPool* pPool = (SfxStyleSheetPool*)mpObject->GetModel()->GetStyleSheetPool(); if( pPool ) mpOutliner->SetStyleSheetPool( pPool ); SfxStyleSheet* pStyleSheet = mpObject->GetPage()->GetTextStyleSheetForObject( mpObject ); if( pStyleSheet ) mpOutliner->SetStyleSheet( 0, pStyleSheet ); if( bVertical ) mpOutliner->SetVertical( sal_True ); } // evtually we have to set the border attributes if (mpOutliner->GetParagraphCount()==1) { // if we only have one paragraph we check if it is empty XubString aStr( mpOutliner->GetText( mpOutliner->GetParagraph( 0 ) ) ); if(!aStr.Len()) { // its empty, so we have to force the outliner to initialise itself mpOutliner->SetText( String(), mpOutliner->GetParagraph( 0 ) ); if(mpObject->GetStyleSheet()) mpOutliner->SetStyleSheet( 0, mpObject->GetStyleSheet()); } } mbDataValid = TRUE; } return mpTextForwarder; } //------------------------------------------------------------------------ SvxTextForwarder* SvxTextEditSourceImpl::GetEditModeTextForwarder() { // are we still in edit mode? SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject ); if( pTextObj && pTextObj->IsTextEditActive() ) { if (!mpTextForwarder) { mpTextForwarder = new SvxOutlinerForwarder( mpModel->GetDrawOutliner() ); // register as listener - need to broadcast state change messages mpTextForwarder->SetNotifyHdl( LINK(this, SvxTextEditSourceImpl, NotifyHdl) ); } return mpTextForwarder; } else { // no, have left it. Revert to background mode delete mpTextForwarder; mpTextForwarder = NULL; return GetBackgroundTextForwarder(); } } //------------------------------------------------------------------------ SvxTextForwarder* SvxTextEditSourceImpl::GetTextForwarder() { if( mbDestroyed || mpObject == NULL ) return NULL; if( mpModel == NULL ) mpModel = mpObject->GetModel(); if( mpModel == NULL ) return NULL; // distinguish the cases // a) background Outliner, reflect changes into ParaOutliner // b) edit mode active, work directly on the EditOutliner if( mpViewForwarder ) return GetEditModeTextForwarder(); else return GetBackgroundTextForwarder(); } //------------------------------------------------------------------------ SvxDrawOutlinerViewForwarder* SvxTextEditSourceImpl::CreateViewForwarder() { if( mpView->GetTextEditOutlinerView() ) return new SvxDrawOutlinerViewForwarder( *mpView->GetTextEditOutlinerView() ); else return NULL; } SvxEditViewForwarder* SvxTextEditSourceImpl::GetEditViewForwarder( sal_Bool bCreate ) { if( mbDestroyed || mpObject == NULL ) return NULL; if( mpModel == NULL ) mpModel = mpObject->GetModel(); if( mpModel == NULL ) return NULL; if( mpViewForwarder ) { // are we still in edit mode? SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject ); if( !pTextObj || !pTextObj->IsTextEditActive() ) { // no, destroy all forwarders (no need for UpdateData(), // it's been synched on EndTextEdit) delete mpViewForwarder; mpViewForwarder = NULL; delete mpTextForwarder; mpTextForwarder = NULL; } } else if( bCreate && mpView ) { // dispose old text forwarder UpdateData(); delete mpTextForwarder; mpTextForwarder = NULL; SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject ); if( pTextObj ) { // edit mode already active? if( pTextObj->IsTextEditActive() ) { // create new view forwarder mpViewForwarder = CreateViewForwarder(); } else { // enter edit mode mpView->EndTextEdit(); if( mpView->BegTextEdit( mpObject, NULL, NULL, (SdrOutliner*)NULL, NULL, FALSE, FALSE ) ) { SdrTextObj* pTextObj = PTR_CAST( SdrTextObj, mpObject ); if( pTextObj && pTextObj->IsTextEditActive() ) { // create new view forwarder mpViewForwarder = CreateViewForwarder(); } else { // failure. Somehow, BegTextEdit did not set // our SdrTextObj into edit mode mpView->EndTextEdit(); } } } } } return mpViewForwarder; } //------------------------------------------------------------------------ void SvxTextEditSourceImpl::UpdateData() { // if we have a view forwarder, we're in edit mode and working // with the DrawOutliner. Thus, all changes made on the text // forwarder are reflected on the view and committed to the model // on EndTextEdit(). Thus, no need for explicit updates here. if( !mpViewForwarder ) { if( mbIsLocked ) { mbNeedsUpdate = sal_True; } else { if( mpOutliner && mpObject && !mbDestroyed ) { if( mpOutliner->GetParagraphCount() != 1 || mpOutliner->GetEditEngine().GetTextLen( 0 ) ) mpObject->SetOutlinerParaObject( mpOutliner->CreateParaObject() ); else mpObject->SetOutlinerParaObject( NULL ); if( mpObject->IsEmptyPresObj() ) mpObject->SetEmptyPresObj(sal_False); } } } } void SvxTextEditSourceImpl::lock() { mbIsLocked = sal_True; if( mpOutliner ) { ((EditEngine*)&(mpOutliner->GetEditEngine()))->SetUpdateMode( sal_False ); mbOldUndoMode = ((EditEngine*)&(mpOutliner->GetEditEngine()))->IsUndoEnabled(); ((EditEngine*)&(mpOutliner->GetEditEngine()))->EnableUndo( sal_False ); } } void SvxTextEditSourceImpl::unlock() { mbIsLocked = sal_False; if( mbNeedsUpdate ) { UpdateData(); mbNeedsUpdate = sal_False; } if( mpOutliner ) { ((EditEngine*)&(mpOutliner->GetEditEngine()))->SetUpdateMode( sal_True ); ((EditEngine*)&(mpOutliner->GetEditEngine()))->EnableUndo( mbOldUndoMode ); } } BOOL SvxTextEditSourceImpl::IsValid() const { return mpView && mpWindow ? TRUE : FALSE; } Rectangle SvxTextEditSourceImpl::GetVisArea() const { if( IsValid() ) { return mpView->GetVisibleArea( mpView->FindWin( const_cast< Window* > (mpWindow) ) ); } return Rectangle(); } Point SvxTextEditSourceImpl::LogicToPixel( const Point& rPoint ) const { if( IsValid() ) { return mpWindow->LogicToPixel( rPoint ); } return Point(); } Point SvxTextEditSourceImpl::PixelToLogic( const Point& rPoint ) const { if( IsValid() ) { return mpWindow->PixelToLogic( rPoint ); } return Point(); } IMPL_LINK(SvxTextEditSourceImpl, NotifyHdl, EENotify*, aNotify) { if( aNotify ) { switch( aNotify->eNotificationType ) { case EE_NOTIFY_TEXTMODIFIED: Broadcast( SvxEditSourceHint( TEXT_HINT_MODIFIED, aNotify->nParagraph ) ); break; case EE_NOTIFY_PARAGRAPHINSERTED: Broadcast( SvxEditSourceHint( TEXT_HINT_PARAINSERTED, aNotify->nParagraph ) ); break; case EE_NOTIFY_PARAGRAPHREMOVED: Broadcast( SvxEditSourceHint( TEXT_HINT_PARAREMOVED, aNotify->nParagraph ) ); break; case EE_NOTIFY_PARAGRAPHSMOVED: Broadcast( SvxEditSourceHint( EDITSOURCE_HINT_PARASMOVED, aNotify->nParagraph, aNotify->nParam1, aNotify->nParam2 ) ); break; case EE_NOTIFY_TEXTHEIGHTCHANGED: Broadcast( SvxEditSourceHint( TEXT_HINT_TEXTHEIGHTCHANGED, aNotify->nParagraph ) ); break; case EE_NOTIFY_TEXTVIEWSCROLLED: Broadcast( SvxEditSourceHint( TEXT_HINT_VIEWSCROLLED ) ); break; case EE_NOTIFY_TEXTVIEWSELECTIONCHANGED: Broadcast( SvxEditSourceHint( EDITSOURCE_HINT_SELECTIONCHANGED ) ); break; default: DBG_ERROR( "SvxTextEditSourceImpl::NotifyHdl unknown notification" ); break; } } return 0; } //------------------------------------------------------------------------ // -------------------------------------------------------------------- // SvxTextEditSource // -------------------------------------------------------------------- SvxTextEditSource::SvxTextEditSource( SdrObject* pObject ) { mpImpl = new SvxTextEditSourceImpl( pObject ); mpImpl->acquire(); } // -------------------------------------------------------------------- SvxTextEditSource::SvxTextEditSource( SdrObject& rObj, SdrView& rView, const Window& rWindow ) { mpImpl = new SvxTextEditSourceImpl( rObj, rView, rWindow ); mpImpl->acquire(); } // -------------------------------------------------------------------- SvxTextEditSource::SvxTextEditSource( SvxTextEditSourceImpl* pImpl ) { mpImpl = pImpl; mpImpl->acquire(); } //------------------------------------------------------------------------ SvxTextEditSource::~SvxTextEditSource() { OGuard aGuard( Application::GetSolarMutex() ); mpImpl->release(); } //------------------------------------------------------------------------ SvxEditSource* SvxTextEditSource::Clone() const { return new SvxTextEditSource( mpImpl ); } //------------------------------------------------------------------------ SvxTextForwarder* SvxTextEditSource::GetTextForwarder() { return mpImpl->GetTextForwarder(); } //------------------------------------------------------------------------ SvxEditViewForwarder* SvxTextEditSource::GetEditViewForwarder( sal_Bool bCreate ) { return mpImpl->GetEditViewForwarder( bCreate ); } //------------------------------------------------------------------------ SvxViewForwarder* SvxTextEditSource::GetViewForwarder() { return this; } //------------------------------------------------------------------------ void SvxTextEditSource::UpdateData() { mpImpl->UpdateData(); } SfxBroadcaster& SvxTextEditSource::GetBroadcaster() const { return *mpImpl; } SdrObject* SvxTextEditSource::GetSdrObject() const { return mpImpl->GetSdrObject(); } void SvxTextEditSource::lock() { mpImpl->lock(); } void SvxTextEditSource::unlock() { mpImpl->unlock(); } BOOL SvxTextEditSource::IsValid() const { return mpImpl->IsValid(); } Rectangle SvxTextEditSource::GetVisArea() const { return mpImpl->GetVisArea(); } Point SvxTextEditSource::LogicToPixel( const Point& rPoint ) const { return mpImpl->LogicToPixel( rPoint ); } Point SvxTextEditSource::PixelToLogic( const Point& rPoint ) const { return mpImpl->PixelToLogic( rPoint ); } /** this method returns true if the outliner para object of the given shape has a paragraph with a level > 0 or if there is a paragraph with the EE_PARA_BULLETSTATE set to true. This is needed for xml export to decide if we need to export the level information. */ sal_Bool SvxTextEditSource::hasLevels( const SdrObject* pObject ) { OutlinerParaObject* pOutlinerParaObject = pObject->GetOutlinerParaObject(); if( NULL == pOutlinerParaObject ) return sal_False; USHORT nParaCount = (USHORT)pOutlinerParaObject->Count(); USHORT nPara; for( nPara = 0; nPara < nParaCount; nPara++ ) { if( pOutlinerParaObject->GetDepth( nPara ) > 0 ) return sal_True; } sal_Bool bHadBulletStateOnEachPara = sal_True; const EditTextObject& rEditTextObject = pOutlinerParaObject->GetTextObject(); const SfxPoolItem* pItem; for( nPara = 0; nPara < nParaCount; nPara++ ) { SfxItemSet aSet = rEditTextObject.GetParaAttribs( nPara ); if( aSet.GetItemState(EE_PARA_BULLETSTATE, sal_False, &pItem) == SFX_ITEM_SET ) { if( ((const SfxUInt16Item*) pItem)->GetValue() ) return sal_True; } else { bHadBulletStateOnEachPara = sal_False; } } // if there was at least one paragraph without a bullet state item we // also need to check the stylesheet for a bullet state item if( !bHadBulletStateOnEachPara && pObject->GetStyleSheet() ) { const SfxItemSet& rSet = pObject->GetStyleSheet()->GetItemSet(); if( rSet.GetItemState(EE_PARA_BULLETSTATE, sal_False, &pItem) == SFX_ITEM_SET ) { if( ((const SfxUInt16Item*)pItem)->GetValue() ) return sal_True; } } return sal_False; }