diff options
author | Mathias Bauer <mba@openoffice.org> | 2010-01-06 19:26:54 +0100 |
---|---|---|
committer | Mathias Bauer <mba@openoffice.org> | 2010-01-06 19:26:54 +0100 |
commit | aed3f1817f4de6314285efed1e48dc7c305e4f67 (patch) | |
tree | fd4f5447a3388f5256bb06dc73708577d217e1c4 /editeng/source/uno/unoforou.cxx | |
parent | 62b69e958ced6717e908f541cc84a83ec94242f3 (diff) |
#i107450#: move code from svx to new module editeng
Diffstat (limited to 'editeng/source/uno/unoforou.cxx')
-rw-r--r-- | editeng/source/uno/unoforou.cxx | 613 |
1 files changed, 613 insertions, 0 deletions
diff --git a/editeng/source/uno/unoforou.cxx b/editeng/source/uno/unoforou.cxx new file mode 100644 index 000000000000..b33153583d31 --- /dev/null +++ b/editeng/source/uno/unoforou.cxx @@ -0,0 +1,613 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: unoforou.cxx,v $ + * $Revision: 1.36 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_editeng.hxx" + +#include <algorithm> +#include <svl/style.hxx> +#include <com/sun/star/i18n/WordType.hpp> + +#include <svl/itemset.hxx> +#include <editeng/editeng.hxx> +#include <editeng/editdata.hxx> +#include <editeng/outliner.hxx> +#include <editeng/unoedhlp.hxx> +#include <svl/poolitem.hxx> +#include <vcl/wrkwin.hxx> +#include <editeng/eeitem.hxx> + +#include <editeng/unoforou.hxx> +#include <editeng/unofored.hxx> +#include <editeng/outlobj.hxx> + +using namespace ::com::sun::star; + +//------------------------------------------------------------------------ + +SvxOutlinerForwarder::SvxOutlinerForwarder( Outliner& rOutl, BOOL bOutlText /* = FALSE */ ) : + rOutliner( rOutl ), + bOutlinerText( bOutlText ), + mpAttribsCache( NULL ), + mpParaAttribsCache( NULL ), + mnParaAttribsCache( 0 ) +{ +} + +SvxOutlinerForwarder::~SvxOutlinerForwarder() +{ + flushCache(); +} + +USHORT SvxOutlinerForwarder::GetParagraphCount() const +{ + return (USHORT)rOutliner.GetParagraphCount(); +} + +USHORT SvxOutlinerForwarder::GetTextLen( USHORT nParagraph ) const +{ + return rOutliner.GetEditEngine().GetTextLen( nParagraph ); +} + +String SvxOutlinerForwarder::GetText( const ESelection& rSel ) const +{ + //! GetText(ESelection) sollte es wohl auch mal am Outliner geben + // solange den Hack fuer die EditEngine uebernehmen: + EditEngine* pEditEngine = (EditEngine*)&rOutliner.GetEditEngine(); + return pEditEngine->GetText( rSel, LINEEND_LF ); +} + +static SfxItemSet ImplOutlinerForwarderGetAttribs( const ESelection& rSel, BOOL bOnlyHardAttrib, EditEngine& rEditEngine ) +{ + if( rSel.nStartPara == rSel.nEndPara ) + { + sal_uInt8 nFlags = 0; + + switch( bOnlyHardAttrib ) + { + case EditEngineAttribs_All: + nFlags = GETATTRIBS_ALL; + break; + case EditEngineAttribs_HardAndPara: + nFlags = GETATTRIBS_PARAATTRIBS|GETATTRIBS_CHARATTRIBS; + break; + case EditEngineAttribs_OnlyHard: + nFlags = GETATTRIBS_CHARATTRIBS; + break; + default: + DBG_ERROR("unknown flags for SvxOutlinerForwarder::GetAttribs"); + } + return rEditEngine.GetAttribs( rSel.nStartPara, rSel.nStartPos, rSel.nEndPos, nFlags ); + } + else + { + return rEditEngine.GetAttribs( rSel, bOnlyHardAttrib ); + } +} + +SfxItemSet SvxOutlinerForwarder::GetAttribs( const ESelection& rSel, BOOL bOnlyHardAttrib ) const +{ + if( mpAttribsCache && ( 0 == bOnlyHardAttrib ) ) + { + // have we the correct set in cache? + if( ((SvxOutlinerForwarder*)this)->maAttribCacheSelection.IsEqual(rSel) ) + { + // yes! just return the cache + return *mpAttribsCache; + } + else + { + // no, we need delete the old cache + delete mpAttribsCache; + mpAttribsCache = NULL; + } + } + + //! gibt's das nicht am Outliner ??? + //! und warum ist GetAttribs an der EditEngine nicht const? + EditEngine& rEditEngine = (EditEngine&)rOutliner.GetEditEngine(); + + SfxItemSet aSet( ImplOutlinerForwarderGetAttribs( rSel, bOnlyHardAttrib, rEditEngine ) ); + + if( 0 == bOnlyHardAttrib ) + { + mpAttribsCache = new SfxItemSet( aSet ); + maAttribCacheSelection = rSel; + } + + SfxStyleSheet* pStyle = rEditEngine.GetStyleSheet( rSel.nStartPara ); + if( pStyle ) + aSet.SetParent( &(pStyle->GetItemSet() ) ); + + return aSet; +} + +SfxItemSet SvxOutlinerForwarder::GetParaAttribs( USHORT nPara ) const +{ + if( mpParaAttribsCache ) + { + // have we the correct set in cache? + if( nPara == mnParaAttribsCache ) + { + // yes! just return the cache + return *mpParaAttribsCache; + } + else + { + // no, we need delete the old cache + delete mpParaAttribsCache; + mpParaAttribsCache = NULL; + } + } + + mpParaAttribsCache = new SfxItemSet( rOutliner.GetParaAttribs( nPara ) ); + mnParaAttribsCache = nPara; + + EditEngine& rEditEngine = (EditEngine&)rOutliner.GetEditEngine(); + + SfxStyleSheet* pStyle = rEditEngine.GetStyleSheet( nPara ); + if( pStyle ) + mpParaAttribsCache->SetParent( &(pStyle->GetItemSet() ) ); + + return *mpParaAttribsCache; +} + +void SvxOutlinerForwarder::SetParaAttribs( USHORT nPara, const SfxItemSet& rSet ) +{ + flushCache(); + + const SfxItemSet* pOldParent = rSet.GetParent(); + if( pOldParent ) + ((SfxItemSet*)&rSet)->SetParent( NULL ); + + rOutliner.SetParaAttribs( nPara, rSet ); + + if( pOldParent ) + ((SfxItemSet*)&rSet)->SetParent( pOldParent ); +} + +void SvxOutlinerForwarder::RemoveAttribs( const ESelection& rSelection, sal_Bool bRemoveParaAttribs, sal_uInt16 nWhich ) +{ + rOutliner.RemoveAttribs( rSelection, bRemoveParaAttribs, nWhich ); +} + +SfxItemPool* SvxOutlinerForwarder::GetPool() const +{ + return rOutliner.GetEmptyItemSet().GetPool(); +} + +void SvxOutlinerForwarder::GetPortions( USHORT nPara, SvUShorts& rList ) const +{ + ((EditEngine&)rOutliner.GetEditEngine()).GetPortions( nPara, rList ); +} + +void SvxOutlinerForwarder::QuickInsertText( const String& rText, const ESelection& rSel ) +{ + flushCache(); + if( rText.Len() == 0 ) + { + rOutliner.QuickDelete( rSel ); + } + else + { + rOutliner.QuickInsertText( rText, rSel ); + } +} + +void SvxOutlinerForwarder::QuickInsertLineBreak( const ESelection& rSel ) +{ + flushCache(); + rOutliner.QuickInsertLineBreak( rSel ); +} + +void SvxOutlinerForwarder::QuickInsertField( const SvxFieldItem& rFld, const ESelection& rSel ) +{ + flushCache(); + rOutliner.QuickInsertField( rFld, rSel ); +} + +void SvxOutlinerForwarder::QuickSetAttribs( const SfxItemSet& rSet, const ESelection& rSel ) +{ + flushCache(); + rOutliner.QuickSetAttribs( rSet, rSel ); +} + +XubString SvxOutlinerForwarder::CalcFieldValue( const SvxFieldItem& rField, USHORT nPara, USHORT nPos, Color*& rpTxtColor, Color*& rpFldColor ) +{ + return rOutliner.CalcFieldValue( rField, nPara, nPos, rpTxtColor, rpFldColor ); +} + +BOOL SvxOutlinerForwarder::IsValid() const +{ + // cannot reliably query outliner state + // while in the middle of an update + return rOutliner.GetUpdateMode(); +} + +extern USHORT GetSvxEditEngineItemState( EditEngine& rEditEngine, const ESelection& rSel, USHORT nWhich ); + +USHORT SvxOutlinerForwarder::GetItemState( const ESelection& rSel, USHORT nWhich ) const +{ + return GetSvxEditEngineItemState( (EditEngine&)rOutliner.GetEditEngine(), rSel, nWhich ); +} + +USHORT SvxOutlinerForwarder::GetItemState( USHORT nPara, USHORT nWhich ) const +{ + const SfxItemSet& rSet = rOutliner.GetParaAttribs( nPara ); + return rSet.GetItemState( nWhich ); +} + + +void SvxOutlinerForwarder::flushCache() +{ + if( mpAttribsCache ) + { + delete mpAttribsCache; + mpAttribsCache = NULL; + } + + if( mpParaAttribsCache ) + { + delete mpParaAttribsCache; + mpParaAttribsCache = NULL; + } +} + +LanguageType SvxOutlinerForwarder::GetLanguage( USHORT nPara, USHORT nIndex ) const +{ + return rOutliner.GetLanguage(nPara, nIndex); +} + +USHORT SvxOutlinerForwarder::GetFieldCount( USHORT nPara ) const +{ + return rOutliner.GetEditEngine().GetFieldCount(nPara); +} + +EFieldInfo SvxOutlinerForwarder::GetFieldInfo( USHORT nPara, USHORT nField ) const +{ + return rOutliner.GetEditEngine().GetFieldInfo( nPara, nField ); +} + +EBulletInfo SvxOutlinerForwarder::GetBulletInfo( USHORT nPara ) const +{ + return rOutliner.GetBulletInfo( nPara ); +} + +Rectangle SvxOutlinerForwarder::GetCharBounds( USHORT nPara, USHORT nIndex ) const +{ + // #101701# + // EditEngine's 'internal' methods like GetCharacterBounds() + // don't rotate for vertical text. + Size aSize( rOutliner.CalcTextSize() ); + ::std::swap( aSize.Width(), aSize.Height() ); + bool bIsVertical( rOutliner.IsVertical() == TRUE ); + + // #108900# Handle virtual position one-past-the end of the string + if( nIndex >= GetTextLen(nPara) ) + { + Rectangle aLast; + + if( nIndex ) + { + // use last character, if possible + aLast = rOutliner.GetEditEngine().GetCharacterBounds( EPosition(nPara, nIndex-1) ); + + // move at end of this last character, make one pixel wide + aLast.Move( aLast.Right() - aLast.Left(), 0 ); + aLast.SetSize( Size(1, aLast.GetHeight()) ); + + // take care for CTL + aLast = SvxEditSourceHelper::EEToUserSpace( aLast, aSize, bIsVertical ); + } + else + { + // #109864# Bounds must lie within the paragraph + aLast = GetParaBounds( nPara ); + + // #109151# Don't use paragraph height, but line height + // instead. aLast is already CTL-correct + if( bIsVertical) + aLast.SetSize( Size( rOutliner.GetLineHeight(nPara,0), 1 ) ); + else + aLast.SetSize( Size( 1, rOutliner.GetLineHeight(nPara,0) ) ); + } + + return aLast; + } + else + { + return SvxEditSourceHelper::EEToUserSpace( rOutliner.GetEditEngine().GetCharacterBounds( EPosition(nPara, nIndex) ), + aSize, bIsVertical ); + } +} + +Rectangle SvxOutlinerForwarder::GetParaBounds( USHORT nPara ) const +{ + Point aPnt = rOutliner.GetDocPosTopLeft( nPara ); + Size aSize = rOutliner.CalcTextSize(); + + if( rOutliner.IsVertical() ) + { + // #101701# + // Hargl. Outliner's 'external' methods return the rotated + // dimensions, 'internal' methods like GetTextHeight( n ) + // don't rotate. + ULONG nWidth = rOutliner.GetTextHeight( nPara ); + + return Rectangle( aSize.Width() - aPnt.Y() - nWidth, 0, aSize.Width() - aPnt.Y(), aSize.Height() ); + } + else + { + ULONG nHeight = rOutliner.GetTextHeight( nPara ); + + return Rectangle( 0, aPnt.Y(), aSize.Width(), aPnt.Y() + nHeight ); + } +} + +MapMode SvxOutlinerForwarder::GetMapMode() const +{ + return rOutliner.GetRefMapMode(); +} + +OutputDevice* SvxOutlinerForwarder::GetRefDevice() const +{ + return rOutliner.GetRefDevice(); +} + +sal_Bool SvxOutlinerForwarder::GetIndexAtPoint( const Point& rPos, USHORT& nPara, USHORT& nIndex ) const +{ + // #101701# + Size aSize( rOutliner.CalcTextSize() ); + ::std::swap( aSize.Width(), aSize.Height() ); + Point aEEPos( SvxEditSourceHelper::UserSpaceToEE( rPos, + aSize, + rOutliner.IsVertical() == TRUE )); + + EPosition aDocPos = rOutliner.GetEditEngine().FindDocPosition( aEEPos ); + + nPara = aDocPos.nPara; + nIndex = aDocPos.nIndex; + + return sal_True; +} + +sal_Bool SvxOutlinerForwarder::GetWordIndices( USHORT nPara, USHORT nIndex, USHORT& nStart, USHORT& nEnd ) const +{ + ESelection aRes = rOutliner.GetEditEngine().GetWord( ESelection(nPara, nIndex, nPara, nIndex), com::sun::star::i18n::WordType::DICTIONARY_WORD ); + + if( aRes.nStartPara == nPara && + aRes.nStartPara == aRes.nEndPara ) + { + nStart = aRes.nStartPos; + nEnd = aRes.nEndPos; + + return sal_True; + } + + return sal_False; +} + +sal_Bool SvxOutlinerForwarder::GetAttributeRun( USHORT& nStartIndex, USHORT& nEndIndex, USHORT nPara, USHORT nIndex ) const +{ + return SvxEditSourceHelper::GetAttributeRun( nStartIndex, nEndIndex, rOutliner.GetEditEngine(), nPara, nIndex ); +} + +USHORT SvxOutlinerForwarder::GetLineCount( USHORT nPara ) const +{ + return static_cast < USHORT >( rOutliner.GetLineCount(nPara) ); +} + +USHORT SvxOutlinerForwarder::GetLineLen( USHORT nPara, USHORT nLine ) const +{ + return rOutliner.GetLineLen(nPara, nLine); +} + +void SvxOutlinerForwarder::GetLineBoundaries( /*out*/USHORT &rStart, /*out*/USHORT &rEnd, USHORT nPara, USHORT nLine ) const +{ + return rOutliner.GetEditEngine().GetLineBoundaries( rStart, rEnd, nPara, nLine ); +} + +USHORT SvxOutlinerForwarder::GetLineNumberAtIndex( USHORT nPara, USHORT nIndex ) const +{ + return rOutliner.GetEditEngine().GetLineNumberAtIndex( nPara, nIndex ); +} + +sal_Bool SvxOutlinerForwarder::QuickFormatDoc( BOOL ) +{ + rOutliner.QuickFormatDoc(); + + return sal_True; +} + +sal_Bool SvxOutlinerForwarder::Delete( const ESelection& rSelection ) +{ + flushCache(); + rOutliner.QuickDelete( rSelection ); + rOutliner.QuickFormatDoc(); + + return sal_True; +} + +sal_Bool SvxOutlinerForwarder::InsertText( const String& rStr, const ESelection& rSelection ) +{ + flushCache(); + rOutliner.QuickInsertText( rStr, rSelection ); + rOutliner.QuickFormatDoc(); + + return sal_True; +} + +sal_Int16 SvxOutlinerForwarder::GetDepth( USHORT nPara ) const +{ + DBG_ASSERT( nPara < GetParagraphCount(), "SvxOutlinerForwarder::GetDepth: Invalid paragraph index"); + + Paragraph* pPara = rOutliner.GetParagraph( nPara ); + + sal_Int16 nLevel = -1; + + if( pPara ) + nLevel = rOutliner.GetDepth( nPara ); + + return nLevel; +} + +sal_Bool SvxOutlinerForwarder::SetDepth( USHORT nPara, sal_Int16 nNewDepth ) +{ + DBG_ASSERT( nPara < GetParagraphCount(), "SvxOutlinerForwarder::SetDepth: Invalid paragraph index"); + + if( (nNewDepth >= -1) && (nNewDepth <= 9) && (nPara < GetParagraphCount()) ) + { + Paragraph* pPara = rOutliner.GetParagraph( nPara ); + if( pPara ) + { + rOutliner.SetDepth( pPara, nNewDepth ); + +// const bool bOutlinerText = pSdrObject && (pSdrObject->GetObjInventor() == SdrInventor) && (pSdrObject->GetObjIdentifier() == OBJ_OUTLINETEXT); + if( bOutlinerText ) + rOutliner.SetLevelDependendStyleSheet( nPara ); + + return sal_True; + } + } + + return sal_False; +} + +sal_Int16 SvxOutlinerForwarder::GetNumberingStartValue( sal_uInt16 nPara ) +{ + if( nPara < GetParagraphCount() ) + { + return rOutliner.GetNumberingStartValue( nPara ); + } + else + { + DBG_ERROR( "SvxOutlinerForwarder::GetNumberingStartValue)(), Invalid paragraph index"); + return -1; + } +} + +void SvxOutlinerForwarder::SetNumberingStartValue( sal_uInt16 nPara, sal_Int16 nNumberingStartValue ) +{ + if( nPara < GetParagraphCount() ) + { + rOutliner.SetNumberingStartValue( nPara, nNumberingStartValue ); + } + else + { + DBG_ERROR( "SvxOutlinerForwarder::SetNumberingStartValue)(), Invalid paragraph index"); + } +} + +sal_Bool SvxOutlinerForwarder::IsParaIsNumberingRestart( sal_uInt16 nPara ) +{ + if( nPara < GetParagraphCount() ) + { + return rOutliner.IsParaIsNumberingRestart( nPara ); + } + else + { + DBG_ERROR( "SvxOutlinerForwarder::IsParaIsNumberingRestart)(), Invalid paragraph index"); + return sal_False; + } +} + +void SvxOutlinerForwarder::SetParaIsNumberingRestart( sal_uInt16 nPara, sal_Bool bParaIsNumberingRestart ) +{ + if( nPara < GetParagraphCount() ) + { + rOutliner.SetParaIsNumberingRestart( nPara, bParaIsNumberingRestart ); + } + else + { + DBG_ERROR( "SvxOutlinerForwarder::SetParaIsNumberingRestart)(), Invalid paragraph index"); + } +} + +const SfxItemSet * SvxOutlinerForwarder::GetEmptyItemSetPtr() +{ + EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() ); + return &rEditEngine.GetEmptyItemSet(); +} + +void SvxOutlinerForwarder::AppendParagraph() +{ + EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() ); + rEditEngine.InsertParagraph( rEditEngine.GetParagraphCount(), String::EmptyString() ); +} + +xub_StrLen SvxOutlinerForwarder::AppendTextPortion( USHORT nPara, const String &rText, const SfxItemSet & /*rSet*/ ) +{ + xub_StrLen nLen = 0; + + EditEngine& rEditEngine = const_cast< EditEngine& >( rOutliner.GetEditEngine() ); + USHORT nParaCount = rEditEngine.GetParagraphCount(); + DBG_ASSERT( nPara < nParaCount, "paragraph index out of bounds" ); + if (/*0 <= nPara && */nPara < nParaCount) + { + nLen = rEditEngine.GetTextLen( nPara ); + rEditEngine.QuickInsertText( rText, ESelection( nPara, nLen, nPara, nLen ) ); + } + + return nLen; +} + +void SvxOutlinerForwarder::CopyText(const SvxTextForwarder& rSource) +{ + const SvxOutlinerForwarder* pSourceForwarder = dynamic_cast< const SvxOutlinerForwarder* >( &rSource ); + if( !pSourceForwarder ) + return; + OutlinerParaObject* pNewOutlinerParaObject = pSourceForwarder->rOutliner.CreateParaObject(); + rOutliner.SetText( *pNewOutlinerParaObject ); + delete pNewOutlinerParaObject; +} + +//------------------------------------------------------------------------ + + +sal_Int16 SvxTextForwarder::GetNumberingStartValue( sal_uInt16 ) +{ + return -1; +} + +void SvxTextForwarder::SetNumberingStartValue( sal_uInt16, sal_Int16 ) +{ +} + +sal_Bool SvxTextForwarder::IsParaIsNumberingRestart( sal_uInt16 ) +{ + return sal_False; +} + +void SvxTextForwarder::SetParaIsNumberingRestart( sal_uInt16, sal_Bool ) +{ +} + +//------------------------------------------------------------------------ + |