| /************************************************************** |
| * |
| * 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_editeng.hxx" |
| #include <tools/debug.hxx> |
| |
| #include <editeng/unoedhlp.hxx> |
| #include <editeng/editdata.hxx> |
| #include <editeng/editeng.hxx> |
| |
| //------------------------------------------------------------------------ |
| |
| TYPEINIT1( SvxEditSourceHint, TextHint ); |
| |
| SvxEditSourceHint::SvxEditSourceHint( sal_uLong _nId ) : |
| TextHint( _nId ), |
| mnStart( 0 ), |
| mnEnd( 0 ) |
| { |
| } |
| |
| SvxEditSourceHint::SvxEditSourceHint( sal_uLong _nId, sal_uLong nValue, sal_uLong nStart, sal_uLong nEnd ) : |
| TextHint( _nId, nValue ), |
| mnStart( nStart), |
| mnEnd( nEnd ) |
| { |
| } |
| |
| sal_uLong SvxEditSourceHint::GetValue() const |
| { |
| return TextHint::GetValue(); |
| } |
| |
| sal_uLong SvxEditSourceHint::GetStartValue() const |
| { |
| return mnStart; |
| } |
| |
| sal_uLong SvxEditSourceHint::GetEndValue() const |
| { |
| return mnEnd; |
| } |
| |
| void SvxEditSourceHint::SetValue( sal_uLong n ) |
| { |
| TextHint::SetValue( n ); |
| } |
| |
| void SvxEditSourceHint::SetStartValue( sal_uLong n ) |
| { |
| mnStart = n; |
| } |
| |
| void SvxEditSourceHint::SetEndValue( sal_uLong n ) |
| { |
| mnEnd = n; |
| } |
| |
| //------------------------------------------------------------------------ |
| |
| ::std::auto_ptr<SfxHint> SvxEditSourceHelper::EENotification2Hint( EENotify* aNotify ) |
| { |
| if( aNotify ) |
| { |
| switch( aNotify->eNotificationType ) |
| { |
| case EE_NOTIFY_TEXTMODIFIED: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_MODIFIED, aNotify->nParagraph ) ); |
| |
| case EE_NOTIFY_PARAGRAPHINSERTED: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_PARAINSERTED, aNotify->nParagraph ) ); |
| |
| case EE_NOTIFY_PARAGRAPHREMOVED: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_PARAREMOVED, aNotify->nParagraph ) ); |
| |
| case EE_NOTIFY_PARAGRAPHSMOVED: |
| return ::std::auto_ptr<SfxHint>( new SvxEditSourceHint( EDITSOURCE_HINT_PARASMOVED, aNotify->nParagraph, aNotify->nParam1, aNotify->nParam2 ) ); |
| |
| case EE_NOTIFY_TEXTHEIGHTCHANGED: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_TEXTHEIGHTCHANGED, aNotify->nParagraph ) ); |
| |
| case EE_NOTIFY_TEXTVIEWSCROLLED: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_VIEWSCROLLED ) ); |
| |
| case EE_NOTIFY_TEXTVIEWSELECTIONCHANGED: |
| return ::std::auto_ptr<SfxHint>( new SvxEditSourceHint( EDITSOURCE_HINT_SELECTIONCHANGED ) ); |
| |
| case EE_NOTIFY_BLOCKNOTIFICATION_START: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_BLOCKNOTIFICATION_START, 0 ) ); |
| |
| case EE_NOTIFY_BLOCKNOTIFICATION_END: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_BLOCKNOTIFICATION_END, 0 ) ); |
| |
| case EE_NOTIFY_INPUT_START: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_INPUT_START, 0 ) ); |
| |
| case EE_NOTIFY_INPUT_END: |
| return ::std::auto_ptr<SfxHint>( new TextHint( TEXT_HINT_INPUT_END, 0 ) ); |
| |
| default: |
| DBG_ERROR( "SvxEditSourceHelper::EENotification2Hint unknown notification" ); |
| break; |
| } |
| } |
| |
| return ::std::auto_ptr<SfxHint>( new SfxHint() ); |
| } |
| |
| sal_Bool SvxEditSourceHelper::GetAttributeRun( sal_uInt16& nStartIndex, sal_uInt16& nEndIndex, const EditEngine& rEE, sal_uInt16 nPara, sal_uInt16 nIndex ) |
| { |
| EECharAttribArray aCharAttribs; |
| |
| rEE.GetCharAttribs( nPara, aCharAttribs ); |
| |
| // find closest index in front of nIndex |
| sal_uInt16 nAttr, nCurrIndex; |
| sal_Int32 nClosestStartIndex; |
| for( nAttr=0, nClosestStartIndex=0; nAttr<aCharAttribs.Count(); ++nAttr ) |
| { |
| nCurrIndex = aCharAttribs[nAttr].nStart; |
| |
| if( nCurrIndex > nIndex ) |
| break; // aCharAttribs array is sorted in increasing order for nStart values |
| |
| if( nCurrIndex > nClosestStartIndex ) |
| { |
| nClosestStartIndex = nCurrIndex; |
| } |
| } |
| |
| // find closest index behind of nIndex |
| sal_Int32 nClosestEndIndex; |
| for( nAttr=0, nClosestEndIndex=rEE.GetTextLen(nPara); nAttr<aCharAttribs.Count(); ++nAttr ) |
| { |
| nCurrIndex = aCharAttribs[nAttr].nEnd; |
| |
| if( nCurrIndex > nIndex && |
| nCurrIndex < nClosestEndIndex ) |
| { |
| nClosestEndIndex = nCurrIndex; |
| } |
| } |
| |
| nStartIndex = static_cast<sal_uInt16>( nClosestStartIndex ); |
| nEndIndex = static_cast<sal_uInt16>( nClosestEndIndex ); |
| |
| return sal_True; |
| } |
| |
| Point SvxEditSourceHelper::EEToUserSpace( const Point& rPoint, const Size& rEESize, bool bIsVertical ) |
| { |
| return bIsVertical ? Point( -rPoint.Y() + rEESize.Height(), rPoint.X() ) : rPoint; |
| } |
| |
| Point SvxEditSourceHelper::UserSpaceToEE( const Point& rPoint, const Size& rEESize, bool bIsVertical ) |
| { |
| return bIsVertical ? Point( rPoint.Y(), -rPoint.X() + rEESize.Height() ) : rPoint; |
| } |
| |
| Rectangle SvxEditSourceHelper::EEToUserSpace( const Rectangle& rRect, const Size& rEESize, bool bIsVertical ) |
| { |
| // #106775# Don't touch rect if not vertical |
| return bIsVertical ? Rectangle( EEToUserSpace(rRect.BottomLeft(), rEESize, bIsVertical), |
| EEToUserSpace(rRect.TopRight(), rEESize, bIsVertical) ) : rRect; |
| } |
| |
| Rectangle SvxEditSourceHelper::UserSpaceToEE( const Rectangle& rRect, const Size& rEESize, bool bIsVertical ) |
| { |
| // #106775# Don't touch rect if not vertical |
| return bIsVertical ? Rectangle( UserSpaceToEE(rRect.TopRight(), rEESize, bIsVertical), |
| UserSpaceToEE(rRect.BottomLeft(), rEESize, bIsVertical) ) : rRect; |
| } |