1190118d0SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3190118d0SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4190118d0SAndrew Rist * or more contributor license agreements. See the NOTICE file 5190118d0SAndrew Rist * distributed with this work for additional information 6190118d0SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7190118d0SAndrew Rist * to you under the Apache License, Version 2.0 (the 8190118d0SAndrew Rist * "License"); you may not use this file except in compliance 9190118d0SAndrew Rist * with the License. You may obtain a copy of the License at 10cdf0e10cSrcweir * 11190118d0SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12cdf0e10cSrcweir * 13190118d0SAndrew Rist * Unless required by applicable law or agreed to in writing, 14190118d0SAndrew Rist * software distributed under the License is distributed on an 15190118d0SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16190118d0SAndrew Rist * KIND, either express or implied. See the License for the 17190118d0SAndrew Rist * specific language governing permissions and limitations 18190118d0SAndrew Rist * under the License. 19cdf0e10cSrcweir * 20190118d0SAndrew Rist *************************************************************/ 21190118d0SAndrew Rist 22190118d0SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove 25cdf0e10cSrcweir #include "precompiled_editeng.hxx" 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <algorithm> 28cdf0e10cSrcweir #include <svl/style.hxx> 29cdf0e10cSrcweir #include <com/sun/star/i18n/WordType.hpp> 30cdf0e10cSrcweir 31cdf0e10cSrcweir #include <svl/itemset.hxx> 32cdf0e10cSrcweir #include <editeng/editeng.hxx> 33cdf0e10cSrcweir #include <editeng/editdata.hxx> 34cdf0e10cSrcweir #include <editeng/outliner.hxx> 35cdf0e10cSrcweir #include <editeng/unoedhlp.hxx> 36cdf0e10cSrcweir #include <svl/poolitem.hxx> 37cdf0e10cSrcweir #include <vcl/wrkwin.hxx> 38cdf0e10cSrcweir #include <editeng/eeitem.hxx> 39cdf0e10cSrcweir 40cdf0e10cSrcweir #include <editeng/unoforou.hxx> 41cdf0e10cSrcweir #include <editeng/unofored.hxx> 42cdf0e10cSrcweir #include <editeng/outlobj.hxx> 43cdf0e10cSrcweir 44cdf0e10cSrcweir using namespace ::com::sun::star; 45cdf0e10cSrcweir 46cdf0e10cSrcweir //------------------------------------------------------------------------ 47cdf0e10cSrcweir 48cdf0e10cSrcweir SvxOutlinerForwarder::SvxOutlinerForwarder( Outliner& rOutl, sal_Bool bOutlText /* = sal_False */ ) : 49cdf0e10cSrcweir rOutliner( rOutl ), 50cdf0e10cSrcweir bOutlinerText( bOutlText ), 51cdf0e10cSrcweir mpAttribsCache( NULL ), 52cdf0e10cSrcweir mpParaAttribsCache( NULL ), 53cdf0e10cSrcweir mnParaAttribsCache( 0 ) 54cdf0e10cSrcweir { 55cdf0e10cSrcweir } 56cdf0e10cSrcweir 57cdf0e10cSrcweir SvxOutlinerForwarder::~SvxOutlinerForwarder() 58cdf0e10cSrcweir { 59cdf0e10cSrcweir flushCache(); 60cdf0e10cSrcweir } 61cdf0e10cSrcweir 62cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetParagraphCount() const 63cdf0e10cSrcweir { 64cdf0e10cSrcweir return (sal_uInt16)rOutliner.GetParagraphCount(); 65cdf0e10cSrcweir } 66cdf0e10cSrcweir 67cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetTextLen( sal_uInt16 nParagraph ) const 68cdf0e10cSrcweir { 69cdf0e10cSrcweir return rOutliner.GetEditEngine().GetTextLen( nParagraph ); 70cdf0e10cSrcweir } 71cdf0e10cSrcweir 72cdf0e10cSrcweir String SvxOutlinerForwarder::GetText( const ESelection& rSel ) const 73cdf0e10cSrcweir { 74cdf0e10cSrcweir //! GetText(ESelection) sollte es wohl auch mal am Outliner geben 75cdf0e10cSrcweir // solange den Hack fuer die EditEngine uebernehmen: 76cdf0e10cSrcweir EditEngine* pEditEngine = (EditEngine*)&rOutliner.GetEditEngine(); 77cdf0e10cSrcweir return pEditEngine->GetText( rSel, LINEEND_LF ); 78cdf0e10cSrcweir } 79cdf0e10cSrcweir 80cdf0e10cSrcweir static SfxItemSet ImplOutlinerForwarderGetAttribs( const ESelection& rSel, sal_Bool bOnlyHardAttrib, EditEngine& rEditEngine ) 81cdf0e10cSrcweir { 82cdf0e10cSrcweir if( rSel.nStartPara == rSel.nEndPara ) 83cdf0e10cSrcweir { 84cdf0e10cSrcweir sal_uInt8 nFlags = 0; 85cdf0e10cSrcweir 86cdf0e10cSrcweir switch( bOnlyHardAttrib ) 87cdf0e10cSrcweir { 88cdf0e10cSrcweir case EditEngineAttribs_All: 89cdf0e10cSrcweir nFlags = GETATTRIBS_ALL; 90cdf0e10cSrcweir break; 91cdf0e10cSrcweir case EditEngineAttribs_HardAndPara: 92cdf0e10cSrcweir nFlags = GETATTRIBS_PARAATTRIBS|GETATTRIBS_CHARATTRIBS; 93cdf0e10cSrcweir break; 94cdf0e10cSrcweir case EditEngineAttribs_OnlyHard: 95cdf0e10cSrcweir nFlags = GETATTRIBS_CHARATTRIBS; 96cdf0e10cSrcweir break; 97cdf0e10cSrcweir default: 98cdf0e10cSrcweir DBG_ERROR("unknown flags for SvxOutlinerForwarder::GetAttribs"); 99cdf0e10cSrcweir } 100cdf0e10cSrcweir return rEditEngine.GetAttribs( rSel.nStartPara, rSel.nStartPos, rSel.nEndPos, nFlags ); 101cdf0e10cSrcweir } 102cdf0e10cSrcweir else 103cdf0e10cSrcweir { 104cdf0e10cSrcweir return rEditEngine.GetAttribs( rSel, bOnlyHardAttrib ); 105cdf0e10cSrcweir } 106cdf0e10cSrcweir } 107cdf0e10cSrcweir 108cdf0e10cSrcweir SfxItemSet SvxOutlinerForwarder::GetAttribs( const ESelection& rSel, sal_Bool bOnlyHardAttrib ) const 109cdf0e10cSrcweir { 110cdf0e10cSrcweir if( mpAttribsCache && ( 0 == bOnlyHardAttrib ) ) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir // have we the correct set in cache? 113cdf0e10cSrcweir if( ((SvxOutlinerForwarder*)this)->maAttribCacheSelection.IsEqual(rSel) ) 114cdf0e10cSrcweir { 115cdf0e10cSrcweir // yes! just return the cache 116cdf0e10cSrcweir return *mpAttribsCache; 117cdf0e10cSrcweir } 118cdf0e10cSrcweir else 119cdf0e10cSrcweir { 120cdf0e10cSrcweir // no, we need delete the old cache 121cdf0e10cSrcweir delete mpAttribsCache; 122cdf0e10cSrcweir mpAttribsCache = NULL; 123cdf0e10cSrcweir } 124cdf0e10cSrcweir } 125cdf0e10cSrcweir 126cdf0e10cSrcweir //! gibt's das nicht am Outliner ??? 127cdf0e10cSrcweir //! und warum ist GetAttribs an der EditEngine nicht const? 128cdf0e10cSrcweir EditEngine& rEditEngine = (EditEngine&)rOutliner.GetEditEngine(); 129cdf0e10cSrcweir 130cdf0e10cSrcweir SfxItemSet aSet( ImplOutlinerForwarderGetAttribs( rSel, bOnlyHardAttrib, rEditEngine ) ); 131cdf0e10cSrcweir 132cdf0e10cSrcweir if( 0 == bOnlyHardAttrib ) 133cdf0e10cSrcweir { 134cdf0e10cSrcweir mpAttribsCache = new SfxItemSet( aSet ); 135cdf0e10cSrcweir maAttribCacheSelection = rSel; 136cdf0e10cSrcweir } 137cdf0e10cSrcweir 138cdf0e10cSrcweir SfxStyleSheet* pStyle = rEditEngine.GetStyleSheet( rSel.nStartPara ); 139cdf0e10cSrcweir if( pStyle ) 140cdf0e10cSrcweir aSet.SetParent( &(pStyle->GetItemSet() ) ); 141cdf0e10cSrcweir 142cdf0e10cSrcweir return aSet; 143cdf0e10cSrcweir } 144cdf0e10cSrcweir 145cdf0e10cSrcweir SfxItemSet SvxOutlinerForwarder::GetParaAttribs( sal_uInt16 nPara ) const 146cdf0e10cSrcweir { 147cdf0e10cSrcweir if( mpParaAttribsCache ) 148cdf0e10cSrcweir { 149cdf0e10cSrcweir // have we the correct set in cache? 150cdf0e10cSrcweir if( nPara == mnParaAttribsCache ) 151cdf0e10cSrcweir { 152cdf0e10cSrcweir // yes! just return the cache 153cdf0e10cSrcweir return *mpParaAttribsCache; 154cdf0e10cSrcweir } 155cdf0e10cSrcweir else 156cdf0e10cSrcweir { 157cdf0e10cSrcweir // no, we need delete the old cache 158cdf0e10cSrcweir delete mpParaAttribsCache; 159cdf0e10cSrcweir mpParaAttribsCache = NULL; 160cdf0e10cSrcweir } 161cdf0e10cSrcweir } 162cdf0e10cSrcweir 163cdf0e10cSrcweir mpParaAttribsCache = new SfxItemSet( rOutliner.GetParaAttribs( nPara ) ); 164cdf0e10cSrcweir mnParaAttribsCache = nPara; 165cdf0e10cSrcweir 166cdf0e10cSrcweir EditEngine& rEditEngine = (EditEngine&)rOutliner.GetEditEngine(); 167cdf0e10cSrcweir 168cdf0e10cSrcweir SfxStyleSheet* pStyle = rEditEngine.GetStyleSheet( nPara ); 169cdf0e10cSrcweir if( pStyle ) 170cdf0e10cSrcweir mpParaAttribsCache->SetParent( &(pStyle->GetItemSet() ) ); 171cdf0e10cSrcweir 172cdf0e10cSrcweir return *mpParaAttribsCache; 173cdf0e10cSrcweir } 174cdf0e10cSrcweir 175cdf0e10cSrcweir void SvxOutlinerForwarder::SetParaAttribs( sal_uInt16 nPara, const SfxItemSet& rSet ) 176cdf0e10cSrcweir { 177cdf0e10cSrcweir flushCache(); 178cdf0e10cSrcweir 179cdf0e10cSrcweir const SfxItemSet* pOldParent = rSet.GetParent(); 180cdf0e10cSrcweir if( pOldParent ) 181cdf0e10cSrcweir ((SfxItemSet*)&rSet)->SetParent( NULL ); 182cdf0e10cSrcweir 183cdf0e10cSrcweir rOutliner.SetParaAttribs( nPara, rSet ); 184cdf0e10cSrcweir 185cdf0e10cSrcweir if( pOldParent ) 186cdf0e10cSrcweir ((SfxItemSet*)&rSet)->SetParent( pOldParent ); 187cdf0e10cSrcweir } 188cdf0e10cSrcweir 189cdf0e10cSrcweir void SvxOutlinerForwarder::RemoveAttribs( const ESelection& rSelection, sal_Bool bRemoveParaAttribs, sal_uInt16 nWhich ) 190cdf0e10cSrcweir { 191cdf0e10cSrcweir rOutliner.RemoveAttribs( rSelection, bRemoveParaAttribs, nWhich ); 192cdf0e10cSrcweir } 193cdf0e10cSrcweir 194cdf0e10cSrcweir SfxItemPool* SvxOutlinerForwarder::GetPool() const 195cdf0e10cSrcweir { 196cdf0e10cSrcweir return rOutliner.GetEmptyItemSet().GetPool(); 197cdf0e10cSrcweir } 198cdf0e10cSrcweir 199cdf0e10cSrcweir void SvxOutlinerForwarder::GetPortions( sal_uInt16 nPara, SvUShorts& rList ) const 200cdf0e10cSrcweir { 201cdf0e10cSrcweir ((EditEngine&)rOutliner.GetEditEngine()).GetPortions( nPara, rList ); 202cdf0e10cSrcweir } 203cdf0e10cSrcweir 204cdf0e10cSrcweir void SvxOutlinerForwarder::QuickInsertText( const String& rText, const ESelection& rSel ) 205cdf0e10cSrcweir { 206cdf0e10cSrcweir flushCache(); 207cdf0e10cSrcweir if( rText.Len() == 0 ) 208cdf0e10cSrcweir { 209cdf0e10cSrcweir rOutliner.QuickDelete( rSel ); 210cdf0e10cSrcweir } 211cdf0e10cSrcweir else 212cdf0e10cSrcweir { 213cdf0e10cSrcweir rOutliner.QuickInsertText( rText, rSel ); 214cdf0e10cSrcweir } 215cdf0e10cSrcweir } 216cdf0e10cSrcweir 217cdf0e10cSrcweir void SvxOutlinerForwarder::QuickInsertLineBreak( const ESelection& rSel ) 218cdf0e10cSrcweir { 219cdf0e10cSrcweir flushCache(); 220cdf0e10cSrcweir rOutliner.QuickInsertLineBreak( rSel ); 221cdf0e10cSrcweir } 222cdf0e10cSrcweir 223cdf0e10cSrcweir void SvxOutlinerForwarder::QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel ) 224cdf0e10cSrcweir { 225cdf0e10cSrcweir flushCache(); 226cdf0e10cSrcweir rOutliner.QuickInsertField( rFld, rSel ); 227cdf0e10cSrcweir } 228cdf0e10cSrcweir 229cdf0e10cSrcweir void SvxOutlinerForwarder::QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel ) 230cdf0e10cSrcweir { 231cdf0e10cSrcweir flushCache(); 232cdf0e10cSrcweir rOutliner.QuickSetAttribs( rSet, rSel ); 233cdf0e10cSrcweir } 234cdf0e10cSrcweir 235cdf0e10cSrcweir XubString SvxOutlinerForwarder::CalcFieldValue( const SvxFieldItem& rField, sal_uInt16 nPara, sal_uInt16 nPos, Color*& rpTxtColor, Color*& rpFldColor ) 236cdf0e10cSrcweir { 237cdf0e10cSrcweir return rOutliner.CalcFieldValue( rField, nPara, nPos, rpTxtColor, rpFldColor ); 238cdf0e10cSrcweir } 239cdf0e10cSrcweir 240cdf0e10cSrcweir void SvxOutlinerForwarder::FieldClicked( const SvxFieldItem& rField, sal_uInt16 nPara, xub_StrLen nPos ) 241cdf0e10cSrcweir { 242cdf0e10cSrcweir rOutliner.FieldClicked( rField, nPara, nPos ); 243cdf0e10cSrcweir } 244cdf0e10cSrcweir 245cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::IsValid() const 246cdf0e10cSrcweir { 247cdf0e10cSrcweir // cannot reliably query outliner state 248cdf0e10cSrcweir // while in the middle of an update 249cdf0e10cSrcweir return rOutliner.GetUpdateMode(); 250cdf0e10cSrcweir } 251cdf0e10cSrcweir 252cdf0e10cSrcweir extern sal_uInt16 GetSvxEditEngineItemState( EditEngine& rEditEngine, const ESelection& rSel, sal_uInt16 nWhich ); 253cdf0e10cSrcweir 254cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetItemState( const ESelection& rSel, sal_uInt16 nWhich ) const 255cdf0e10cSrcweir { 256cdf0e10cSrcweir return GetSvxEditEngineItemState( (EditEngine&)rOutliner.GetEditEngine(), rSel, nWhich ); 257cdf0e10cSrcweir } 258cdf0e10cSrcweir 259cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetItemState( sal_uInt16 nPara, sal_uInt16 nWhich ) const 260cdf0e10cSrcweir { 261cdf0e10cSrcweir const SfxItemSet& rSet = rOutliner.GetParaAttribs( nPara ); 262cdf0e10cSrcweir return rSet.GetItemState( nWhich ); 263cdf0e10cSrcweir } 264cdf0e10cSrcweir 265cdf0e10cSrcweir 266cdf0e10cSrcweir void SvxOutlinerForwarder::flushCache() 267cdf0e10cSrcweir { 268cdf0e10cSrcweir if( mpAttribsCache ) 269cdf0e10cSrcweir { 270cdf0e10cSrcweir delete mpAttribsCache; 271cdf0e10cSrcweir mpAttribsCache = NULL; 272cdf0e10cSrcweir } 273cdf0e10cSrcweir 274cdf0e10cSrcweir if( mpParaAttribsCache ) 275cdf0e10cSrcweir { 276cdf0e10cSrcweir delete mpParaAttribsCache; 277cdf0e10cSrcweir mpParaAttribsCache = NULL; 278cdf0e10cSrcweir } 279cdf0e10cSrcweir } 280cdf0e10cSrcweir 281cdf0e10cSrcweir LanguageType SvxOutlinerForwarder::GetLanguage( sal_uInt16 nPara, sal_uInt16 nIndex ) const 282cdf0e10cSrcweir { 283cdf0e10cSrcweir return rOutliner.GetLanguage(nPara, nIndex); 284cdf0e10cSrcweir } 285cdf0e10cSrcweir 286cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetFieldCount( sal_uInt16 nPara ) const 287cdf0e10cSrcweir { 288cdf0e10cSrcweir return rOutliner.GetEditEngine().GetFieldCount(nPara); 289cdf0e10cSrcweir } 290cdf0e10cSrcweir 291cdf0e10cSrcweir EFieldInfo SvxOutlinerForwarder::GetFieldInfo( sal_uInt16 nPara, sal_uInt16 nField ) const 292cdf0e10cSrcweir { 293cdf0e10cSrcweir return rOutliner.GetEditEngine().GetFieldInfo( nPara, nField ); 294cdf0e10cSrcweir } 295cdf0e10cSrcweir 296cdf0e10cSrcweir EBulletInfo SvxOutlinerForwarder::GetBulletInfo( sal_uInt16 nPara ) const 297cdf0e10cSrcweir { 298cdf0e10cSrcweir return rOutliner.GetBulletInfo( nPara ); 299cdf0e10cSrcweir } 300cdf0e10cSrcweir 301cdf0e10cSrcweir Rectangle SvxOutlinerForwarder::GetCharBounds( sal_uInt16 nPara, sal_uInt16 nIndex ) const 302cdf0e10cSrcweir { 303cdf0e10cSrcweir // #101701# 304cdf0e10cSrcweir // EditEngine's 'internal' methods like GetCharacterBounds() 305cdf0e10cSrcweir // don't rotate for vertical text. 306cdf0e10cSrcweir Size aSize( rOutliner.CalcTextSize() ); 307cdf0e10cSrcweir ::std::swap( aSize.Width(), aSize.Height() ); 308cdf0e10cSrcweir bool bIsVertical( rOutliner.IsVertical() == sal_True ); 309cdf0e10cSrcweir 310cdf0e10cSrcweir // #108900# Handle virtual position one-past-the end of the string 311cdf0e10cSrcweir if( nIndex >= GetTextLen(nPara) ) 312cdf0e10cSrcweir { 313cdf0e10cSrcweir Rectangle aLast; 314cdf0e10cSrcweir 315cdf0e10cSrcweir if( nIndex ) 316cdf0e10cSrcweir { 317cdf0e10cSrcweir // use last character, if possible 318cdf0e10cSrcweir aLast = rOutliner.GetEditEngine().GetCharacterBounds( EPosition(nPara, nIndex-1) ); 319cdf0e10cSrcweir 320cdf0e10cSrcweir // move at end of this last character, make one pixel wide 321cdf0e10cSrcweir aLast.Move( aLast.Right() - aLast.Left(), 0 ); 322cdf0e10cSrcweir aLast.SetSize( Size(1, aLast.GetHeight()) ); 323cdf0e10cSrcweir 324cdf0e10cSrcweir // take care for CTL 325cdf0e10cSrcweir aLast = SvxEditSourceHelper::EEToUserSpace( aLast, aSize, bIsVertical ); 326cdf0e10cSrcweir } 327cdf0e10cSrcweir else 328cdf0e10cSrcweir { 329cdf0e10cSrcweir // #109864# Bounds must lie within the paragraph 330cdf0e10cSrcweir aLast = GetParaBounds( nPara ); 331cdf0e10cSrcweir 332cdf0e10cSrcweir // #109151# Don't use paragraph height, but line height 333cdf0e10cSrcweir // instead. aLast is already CTL-correct 334cdf0e10cSrcweir if( bIsVertical) 335cdf0e10cSrcweir aLast.SetSize( Size( rOutliner.GetLineHeight(nPara,0), 1 ) ); 336cdf0e10cSrcweir else 337cdf0e10cSrcweir aLast.SetSize( Size( 1, rOutliner.GetLineHeight(nPara,0) ) ); 338cdf0e10cSrcweir } 339cdf0e10cSrcweir 340cdf0e10cSrcweir return aLast; 341cdf0e10cSrcweir } 342cdf0e10cSrcweir else 343cdf0e10cSrcweir { 344cdf0e10cSrcweir return SvxEditSourceHelper::EEToUserSpace( rOutliner.GetEditEngine().GetCharacterBounds( EPosition(nPara, nIndex) ), 345cdf0e10cSrcweir aSize, bIsVertical ); 346cdf0e10cSrcweir } 347cdf0e10cSrcweir } 348cdf0e10cSrcweir 349cdf0e10cSrcweir Rectangle SvxOutlinerForwarder::GetParaBounds( sal_uInt16 nPara ) const 350cdf0e10cSrcweir { 351cdf0e10cSrcweir Point aPnt = rOutliner.GetDocPosTopLeft( nPara ); 352cdf0e10cSrcweir Size aSize = rOutliner.CalcTextSize(); 353cdf0e10cSrcweir 354cdf0e10cSrcweir if( rOutliner.IsVertical() ) 355cdf0e10cSrcweir { 356cdf0e10cSrcweir // #101701# 357cdf0e10cSrcweir // Hargl. Outliner's 'external' methods return the rotated 358cdf0e10cSrcweir // dimensions, 'internal' methods like GetTextHeight( n ) 359cdf0e10cSrcweir // don't rotate. 360cdf0e10cSrcweir sal_uLong nWidth = rOutliner.GetTextHeight( nPara ); 361cdf0e10cSrcweir 362cdf0e10cSrcweir return Rectangle( aSize.Width() - aPnt.Y() - nWidth, 0, aSize.Width() - aPnt.Y(), aSize.Height() ); 363cdf0e10cSrcweir } 364cdf0e10cSrcweir else 365cdf0e10cSrcweir { 366cdf0e10cSrcweir sal_uLong nHeight = rOutliner.GetTextHeight( nPara ); 367cdf0e10cSrcweir 368cdf0e10cSrcweir return Rectangle( 0, aPnt.Y(), aSize.Width(), aPnt.Y() + nHeight ); 369cdf0e10cSrcweir } 370cdf0e10cSrcweir } 371cdf0e10cSrcweir 372cdf0e10cSrcweir MapMode SvxOutlinerForwarder::GetMapMode() const 373cdf0e10cSrcweir { 374cdf0e10cSrcweir return rOutliner.GetRefMapMode(); 375cdf0e10cSrcweir } 376cdf0e10cSrcweir 377cdf0e10cSrcweir OutputDevice* SvxOutlinerForwarder::GetRefDevice() const 378cdf0e10cSrcweir { 379cdf0e10cSrcweir return rOutliner.GetRefDevice(); 380cdf0e10cSrcweir } 381cdf0e10cSrcweir 382cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::GetIndexAtPoint( const Point& rPos, sal_uInt16& nPara, sal_uInt16& nIndex ) const 383cdf0e10cSrcweir { 384cdf0e10cSrcweir // #101701# 385cdf0e10cSrcweir Size aSize( rOutliner.CalcTextSize() ); 386cdf0e10cSrcweir ::std::swap( aSize.Width(), aSize.Height() ); 387cdf0e10cSrcweir Point aEEPos( SvxEditSourceHelper::UserSpaceToEE( rPos, 388cdf0e10cSrcweir aSize, 389cdf0e10cSrcweir rOutliner.IsVertical() == sal_True )); 390cdf0e10cSrcweir 391cdf0e10cSrcweir EPosition aDocPos = rOutliner.GetEditEngine().FindDocPosition( aEEPos ); 392cdf0e10cSrcweir 393cdf0e10cSrcweir nPara = aDocPos.nPara; 394cdf0e10cSrcweir nIndex = aDocPos.nIndex; 395cdf0e10cSrcweir 396cdf0e10cSrcweir return sal_True; 397cdf0e10cSrcweir } 398cdf0e10cSrcweir 399cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::GetWordIndices( sal_uInt16 nPara, sal_uInt16 nIndex, sal_uInt16& nStart, sal_uInt16& nEnd ) const 400cdf0e10cSrcweir { 401cdf0e10cSrcweir ESelection aRes = rOutliner.GetEditEngine().GetWord( ESelection(nPara, nIndex, nPara, nIndex), com::sun::star::i18n::WordType::DICTIONARY_WORD ); 402cdf0e10cSrcweir 403cdf0e10cSrcweir if( aRes.nStartPara == nPara && 404cdf0e10cSrcweir aRes.nStartPara == aRes.nEndPara ) 405cdf0e10cSrcweir { 406cdf0e10cSrcweir nStart = aRes.nStartPos; 407cdf0e10cSrcweir nEnd = aRes.nEndPos; 408cdf0e10cSrcweir 409cdf0e10cSrcweir return sal_True; 410cdf0e10cSrcweir } 411cdf0e10cSrcweir 412cdf0e10cSrcweir return sal_False; 413cdf0e10cSrcweir } 414*9b8096d0SSteve Yin sal_Bool SvxOutlinerForwarder::GetAttributeRun( sal_uInt16& nStartIndex, sal_uInt16& nEndIndex, sal_uInt16 nPara, sal_uInt16 nIndex, sal_Bool bInCell ) const 415cdf0e10cSrcweir { 416*9b8096d0SSteve Yin return SvxEditSourceHelper::GetAttributeRun( nStartIndex, nEndIndex, rOutliner.GetEditEngine(), nPara, nIndex, bInCell ); 417cdf0e10cSrcweir } 418cdf0e10cSrcweir 419cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetLineCount( sal_uInt16 nPara ) const 420cdf0e10cSrcweir { 421cdf0e10cSrcweir return static_cast < sal_uInt16 >( rOutliner.GetLineCount(nPara) ); 422cdf0e10cSrcweir } 423cdf0e10cSrcweir 424cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetLineLen( sal_uInt16 nPara, sal_uInt16 nLine ) const 425cdf0e10cSrcweir { 426cdf0e10cSrcweir return rOutliner.GetLineLen(nPara, nLine); 427cdf0e10cSrcweir } 428cdf0e10cSrcweir 429cdf0e10cSrcweir void SvxOutlinerForwarder::GetLineBoundaries( /*out*/sal_uInt16 &rStart, /*out*/sal_uInt16 &rEnd, sal_uInt16 nPara, sal_uInt16 nLine ) const 430cdf0e10cSrcweir { 431cdf0e10cSrcweir return rOutliner.GetEditEngine().GetLineBoundaries( rStart, rEnd, nPara, nLine ); 432cdf0e10cSrcweir } 433cdf0e10cSrcweir 434cdf0e10cSrcweir sal_uInt16 SvxOutlinerForwarder::GetLineNumberAtIndex( sal_uInt16 nPara, sal_uInt16 nIndex ) const 435cdf0e10cSrcweir { 436cdf0e10cSrcweir return rOutliner.GetEditEngine().GetLineNumberAtIndex( nPara, nIndex ); 437cdf0e10cSrcweir } 438cdf0e10cSrcweir 439cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::QuickFormatDoc( sal_Bool ) 440cdf0e10cSrcweir { 441cdf0e10cSrcweir rOutliner.QuickFormatDoc(); 442cdf0e10cSrcweir 443cdf0e10cSrcweir return sal_True; 444cdf0e10cSrcweir } 445cdf0e10cSrcweir 446cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::Delete( const ESelection& rSelection ) 447cdf0e10cSrcweir { 448cdf0e10cSrcweir flushCache(); 449cdf0e10cSrcweir rOutliner.QuickDelete( rSelection ); 450cdf0e10cSrcweir rOutliner.QuickFormatDoc(); 451cdf0e10cSrcweir 452cdf0e10cSrcweir return sal_True; 453cdf0e10cSrcweir } 454cdf0e10cSrcweir 455cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::InsertText( const String& rStr, const ESelection& rSelection ) 456cdf0e10cSrcweir { 457cdf0e10cSrcweir flushCache(); 458cdf0e10cSrcweir rOutliner.QuickInsertText( rStr, rSelection ); 459cdf0e10cSrcweir rOutliner.QuickFormatDoc(); 460cdf0e10cSrcweir 461cdf0e10cSrcweir return sal_True; 462cdf0e10cSrcweir } 463cdf0e10cSrcweir 464cdf0e10cSrcweir sal_Int16 SvxOutlinerForwarder::GetDepth( sal_uInt16 nPara ) const 465cdf0e10cSrcweir { 466cdf0e10cSrcweir DBG_ASSERT( nPara < GetParagraphCount(), "SvxOutlinerForwarder::GetDepth: Invalid paragraph index"); 467cdf0e10cSrcweir 468cdf0e10cSrcweir Paragraph* pPara = rOutliner.GetParagraph( nPara ); 469cdf0e10cSrcweir 470cdf0e10cSrcweir sal_Int16 nLevel = -1; 471cdf0e10cSrcweir 472cdf0e10cSrcweir if( pPara ) 473cdf0e10cSrcweir nLevel = rOutliner.GetDepth( nPara ); 474cdf0e10cSrcweir 475cdf0e10cSrcweir return nLevel; 476cdf0e10cSrcweir } 477cdf0e10cSrcweir 478cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::SetDepth( sal_uInt16 nPara, sal_Int16 nNewDepth ) 479cdf0e10cSrcweir { 480cdf0e10cSrcweir DBG_ASSERT( nPara < GetParagraphCount(), "SvxOutlinerForwarder::SetDepth: Invalid paragraph index"); 481cdf0e10cSrcweir 482cdf0e10cSrcweir if( (nNewDepth >= -1) && (nNewDepth <= 9) && (nPara < GetParagraphCount()) ) 483cdf0e10cSrcweir { 484cdf0e10cSrcweir Paragraph* pPara = rOutliner.GetParagraph( nPara ); 485cdf0e10cSrcweir if( pPara ) 486cdf0e10cSrcweir { 487cdf0e10cSrcweir rOutliner.SetDepth( pPara, nNewDepth ); 488cdf0e10cSrcweir 489cdf0e10cSrcweir // const bool bOutlinerText = pSdrObject && (pSdrObject->GetObjInventor() == SdrInventor) && (pSdrObject->GetObjIdentifier() == OBJ_OUTLINETEXT); 490cdf0e10cSrcweir if( bOutlinerText ) 491cdf0e10cSrcweir rOutliner.SetLevelDependendStyleSheet( nPara ); 492cdf0e10cSrcweir 493cdf0e10cSrcweir return sal_True; 494cdf0e10cSrcweir } 495cdf0e10cSrcweir } 496cdf0e10cSrcweir 497cdf0e10cSrcweir return sal_False; 498cdf0e10cSrcweir } 499cdf0e10cSrcweir 500cdf0e10cSrcweir sal_Int16 SvxOutlinerForwarder::GetNumberingStartValue( sal_uInt16 nPara ) 501cdf0e10cSrcweir { 502cdf0e10cSrcweir if( nPara < GetParagraphCount() ) 503cdf0e10cSrcweir { 504cdf0e10cSrcweir return rOutliner.GetNumberingStartValue( nPara ); 505cdf0e10cSrcweir } 506cdf0e10cSrcweir else 507cdf0e10cSrcweir { 508cdf0e10cSrcweir DBG_ERROR( "SvxOutlinerForwarder::GetNumberingStartValue)(), Invalid paragraph index"); 509cdf0e10cSrcweir return -1; 510cdf0e10cSrcweir } 511cdf0e10cSrcweir } 512cdf0e10cSrcweir 513cdf0e10cSrcweir void SvxOutlinerForwarder::SetNumberingStartValue( sal_uInt16 nPara, sal_Int16 nNumberingStartValue ) 514cdf0e10cSrcweir { 515cdf0e10cSrcweir if( nPara < GetParagraphCount() ) 516cdf0e10cSrcweir { 517cdf0e10cSrcweir rOutliner.SetNumberingStartValue( nPara, nNumberingStartValue ); 518cdf0e10cSrcweir } 519cdf0e10cSrcweir else 520cdf0e10cSrcweir { 521cdf0e10cSrcweir DBG_ERROR( "SvxOutlinerForwarder::SetNumberingStartValue)(), Invalid paragraph index"); 522cdf0e10cSrcweir } 523cdf0e10cSrcweir } 524cdf0e10cSrcweir 525cdf0e10cSrcweir sal_Bool SvxOutlinerForwarder::IsParaIsNumberingRestart( sal_uInt16 nPara ) 526cdf0e10cSrcweir { 527cdf0e10cSrcweir if( nPara < GetParagraphCount() ) 528cdf0e10cSrcweir { 529cdf0e10cSrcweir return rOutliner.IsParaIsNumberingRestart( nPara ); 530cdf0e10cSrcweir } 531cdf0e10cSrcweir else 532cdf0e10cSrcweir { 533cdf0e10cSrcweir DBG_ERROR( "SvxOutlinerForwarder::IsParaIsNumberingRestart)(), Invalid paragraph index"); 534cdf0e10cSrcweir return sal_False; 535cdf0e10cSrcweir } 536cdf0e10cSrcweir } 537cdf0e10cSrcweir 538cdf0e10cSrcweir void SvxOutlinerForwarder::SetParaIsNumberingRestart( sal_uInt16 nPara, sal_Bool bParaIsNumberingRestart ) 539cdf0e10cSrcweir { 540cdf0e10cSrcweir if( nPara < GetParagraphCount() ) 541cdf0e10cSrcweir { 542cdf0e10cSrcweir rOutliner.SetParaIsNumberingRestart( nPara, bParaIsNumberingRestart ); 543cdf0e10cSrcweir } 544cdf0e10cSrcweir else 545cdf0e10cSrcweir { 546cdf0e10cSrcweir DBG_ERROR( "SvxOutlinerForwarder::SetParaIsNumberingRestart)(), Invalid paragraph index"); 547cdf0e10cSrcweir } 548cdf0e10cSrcweir } 549cdf0e10cSrcweir 550cdf0e10cSrcweir const SfxItemSet * SvxOutlinerForwarder::GetEmptyItemSetPtr() 551cdf0e10cSrcweir { 552cdf0e10cSrcweir EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() ); 553cdf0e10cSrcweir return &rEditEngine.GetEmptyItemSet(); 554cdf0e10cSrcweir } 555cdf0e10cSrcweir 556cdf0e10cSrcweir void SvxOutlinerForwarder::AppendParagraph() 557cdf0e10cSrcweir { 558cdf0e10cSrcweir EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() ); 559cdf0e10cSrcweir rEditEngine.InsertParagraph( rEditEngine.GetParagraphCount(), String::EmptyString() ); 560cdf0e10cSrcweir } 561cdf0e10cSrcweir 562cdf0e10cSrcweir xub_StrLen SvxOutlinerForwarder::AppendTextPortion( sal_uInt16 nPara, const String &rText, const SfxItemSet & /*rSet*/ ) 563cdf0e10cSrcweir { 564cdf0e10cSrcweir xub_StrLen nLen = 0; 565cdf0e10cSrcweir 566cdf0e10cSrcweir EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() ); 567cdf0e10cSrcweir sal_uInt16 nParaCount = rEditEngine.GetParagraphCount(); 568cdf0e10cSrcweir DBG_ASSERT( nPara < nParaCount, "paragraph index out of bounds" ); 569cdf0e10cSrcweir if (/*0 <= nPara && */nPara < nParaCount) 570cdf0e10cSrcweir { 571cdf0e10cSrcweir nLen = rEditEngine.GetTextLen( nPara ); 572cdf0e10cSrcweir rEditEngine.QuickInsertText( rText, ESelection( nPara, nLen, nPara, nLen ) ); 573cdf0e10cSrcweir } 574cdf0e10cSrcweir 575cdf0e10cSrcweir return nLen; 576cdf0e10cSrcweir } 577cdf0e10cSrcweir 578cdf0e10cSrcweir void SvxOutlinerForwarder::CopyText(const SvxTextForwarder& rSource) 579cdf0e10cSrcweir { 580cdf0e10cSrcweir const SvxOutlinerForwarder* pSourceForwarder = dynamic_cast< const SvxOutlinerForwarder* >( &rSource ); 581cdf0e10cSrcweir if( !pSourceForwarder ) 582cdf0e10cSrcweir return; 583cdf0e10cSrcweir OutlinerParaObject* pNewOutlinerParaObject = pSourceForwarder->rOutliner.CreateParaObject(); 584cdf0e10cSrcweir rOutliner.SetText( *pNewOutlinerParaObject ); 585cdf0e10cSrcweir delete pNewOutlinerParaObject; 586cdf0e10cSrcweir } 587cdf0e10cSrcweir 588cdf0e10cSrcweir //------------------------------------------------------------------------ 589cdf0e10cSrcweir 590cdf0e10cSrcweir 591cdf0e10cSrcweir sal_Int16 SvxTextForwarder::GetNumberingStartValue( sal_uInt16 ) 592cdf0e10cSrcweir { 593cdf0e10cSrcweir return -1; 594cdf0e10cSrcweir } 595cdf0e10cSrcweir 596cdf0e10cSrcweir void SvxTextForwarder::SetNumberingStartValue( sal_uInt16, sal_Int16 ) 597cdf0e10cSrcweir { 598cdf0e10cSrcweir } 599cdf0e10cSrcweir 600cdf0e10cSrcweir sal_Bool SvxTextForwarder::IsParaIsNumberingRestart( sal_uInt16 ) 601cdf0e10cSrcweir { 602cdf0e10cSrcweir return sal_False; 603cdf0e10cSrcweir } 604cdf0e10cSrcweir 605cdf0e10cSrcweir void SvxTextForwarder::SetParaIsNumberingRestart( sal_uInt16, sal_Bool ) 606cdf0e10cSrcweir { 607cdf0e10cSrcweir } 608cdf0e10cSrcweir 609cdf0e10cSrcweir //------------------------------------------------------------------------ 610cdf0e10cSrcweir 611