/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ /************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2000, 2010 Oracle and/or its affiliates. * * OpenOffice.org - a multi-platform office productivity suite * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ #include "precompiled_sw.hxx" #include #include #include #include #include #include #include #include #include #include using namespace com::sun::star; // helper functions namespace { const SwWrongList* getTextMarkupList( const SwTxtNode& rTxtNode, const sal_Int32 nTextMarkupType ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) { const SwWrongList* pTextMarkupList( 0 ); switch ( nTextMarkupType ) { case text::TextMarkupType::SPELLCHECK: { pTextMarkupList = rTxtNode.GetWrong(); } break; case text::TextMarkupType::PROOFREADING: { // support not implemented yet pTextMarkupList = 0; } break; case text::TextMarkupType::SMARTTAG: { // support not implemented yet pTextMarkupList = 0; } break; default: { throw lang::IllegalArgumentException(); } } return pTextMarkupList; } } // implementation of class SwTextMarkupHelper::SwTextMarkupHelper( const SwAccessiblePortionData& rPortionData, const SwTxtNode& rTxtNode ) : mrPortionData( rPortionData ) // #i108125# , mpTxtNode( &rTxtNode ) , mpTextMarkupList( 0 ) // <-- { } // #i108125# SwTextMarkupHelper::SwTextMarkupHelper( const SwAccessiblePortionData& rPortionData, const SwWrongList& rTextMarkupList ) : mrPortionData( rPortionData ) , mpTxtNode( 0 ) , mpTextMarkupList( &rTextMarkupList ) { } // <-- sal_Int32 SwTextMarkupHelper::getTextMarkupCount( const sal_Int32 nTextMarkupType ) throw (::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) { sal_Int32 nTextMarkupCount( 0 ); // #i108125# const SwWrongList* pTextMarkupList = mpTextMarkupList ? mpTextMarkupList : getTextMarkupList( *mpTxtNode, nTextMarkupType ); // <-- if ( pTextMarkupList ) { nTextMarkupCount = pTextMarkupList->Count(); } return nTextMarkupCount; } ::com::sun::star::accessibility::TextSegment SwTextMarkupHelper::getTextMarkup( const sal_Int32 nTextMarkupIndex, const sal_Int32 nTextMarkupType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) { if ( nTextMarkupIndex >= getTextMarkupCount( nTextMarkupType ) || nTextMarkupIndex < 0 ) { throw lang::IndexOutOfBoundsException(); } ::com::sun::star::accessibility::TextSegment aTextMarkupSegment; aTextMarkupSegment.SegmentStart = -1; aTextMarkupSegment.SegmentEnd = -1; // #i108125# const SwWrongList* pTextMarkupList = mpTextMarkupList ? mpTextMarkupList : getTextMarkupList( *mpTxtNode, nTextMarkupType ); // <-- if ( pTextMarkupList ) { const SwWrongArea* pTextMarkup = pTextMarkupList->GetElement( static_cast(nTextMarkupIndex) ); if ( pTextMarkup ) { const ::rtl::OUString rText = mrPortionData.GetAccessibleString(); const sal_Int32 nStartPos = mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos ); const sal_Int32 nEndPos = mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos + pTextMarkup->mnLen ); aTextMarkupSegment.SegmentText = rText.copy( nStartPos, nEndPos - nStartPos ); aTextMarkupSegment.SegmentStart = nStartPos; aTextMarkupSegment.SegmentEnd = nEndPos; } else { OSL_ENSURE( false, " - missing instance" ); } } return aTextMarkupSegment; } ::com::sun::star::uno::Sequence< ::com::sun::star::accessibility::TextSegment > SwTextMarkupHelper::getTextMarkupAtIndex( const sal_Int32 nCharIndex, const sal_Int32 nTextMarkupType ) throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::RuntimeException) { // assumption: // value of is in range [0..length of accessible text) const USHORT nCoreCharIndex = mrPortionData.GetModelPosition( nCharIndex ); // Handling of portions with core length == 0 at the beginning of the // paragraph - e.g. numbering portion. if ( mrPortionData.GetAccessiblePosition( nCoreCharIndex ) > nCharIndex ) { return uno::Sequence< ::com::sun::star::accessibility::TextSegment >(); } // #i108125# const SwWrongList* pTextMarkupList = mpTextMarkupList ? mpTextMarkupList : getTextMarkupList( *mpTxtNode, nTextMarkupType ); // <-- ::std::vector< ::com::sun::star::accessibility::TextSegment > aTmpTextMarkups; if ( pTextMarkupList ) { const ::rtl::OUString rText = mrPortionData.GetAccessibleString(); const USHORT nTextMarkupCount = pTextMarkupList->Count(); for ( USHORT nTextMarkupIdx = 0; nTextMarkupIdx < nTextMarkupCount; ++nTextMarkupIdx ) { const SwWrongArea* pTextMarkup = pTextMarkupList->GetElement( static_cast(nTextMarkupIdx) ); OSL_ENSURE( pTextMarkup, " - missing instance" ); if ( pTextMarkup && pTextMarkup->mnPos <= nCoreCharIndex && nCoreCharIndex < ( pTextMarkup->mnPos + pTextMarkup->mnLen ) ) { const sal_Int32 nStartPos = mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos ); const sal_Int32 nEndPos = mrPortionData.GetAccessiblePosition( pTextMarkup->mnPos + pTextMarkup->mnLen ); ::com::sun::star::accessibility::TextSegment aTextMarkupSegment; aTextMarkupSegment.SegmentText = rText.copy( nStartPos, nEndPos - nStartPos ); aTextMarkupSegment.SegmentStart = nStartPos; aTextMarkupSegment.SegmentEnd = nEndPos; aTmpTextMarkups.push_back( aTextMarkupSegment ); } } } uno::Sequence< ::com::sun::star::accessibility::TextSegment > aTextMarkups( aTmpTextMarkups.size() ); ::std::copy( aTmpTextMarkups.begin(), aTmpTextMarkups.end(), ::comphelper::stl_begin( aTextMarkups ) ); return aTextMarkups; } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */